<?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>77567</bug_id>
          
          <creation_ts>2012-02-01 11:59:39 -0800</creation_ts>
          <short_desc>Refactor Mac platform implementation of the Pasteboard class</short_desc>
          <delta_ts>2012-02-06 16:34:59 -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>HTML Editing</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>
          
          <blocked>77259</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>andersca</cc>
    
    <cc>ap</cc>
    
    <cc>jonlee</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>547258</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-01 11:59:39 -0800</bug_when>
    <thetext>We should move all access to NSPasteboard object to a separate class, so that we can have a different implementation for WebKit1 and WebKit2.
We don&apos;t wan&apos;t to access the NSPasteboard object from the WebProcess.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547269</commentid>
    <comment_count>1</comment_count>
      <attachid>124986</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-01 12:10:43 -0800</bug_when>
    <thetext>Created attachment 124986
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547309</commentid>
    <comment_count>2</comment_count>
      <attachid>124986</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-02-01 12:57:25 -0800</bug_when>
    <thetext>Comment on attachment 124986
Patch

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

&gt; Source/WebCore/ChangeLog:29
&gt; +        ():

The boilerplate is expected to be edited to remove such garbage.

&gt; Source/WebCore/platform/Pasteboard.h:72
&gt; +class PasteboardImpl;

There is an include of PasteboardImpl.h above - is it needed?

&gt; Source/WebCore/platform/mac/PasteboardImpl.h:38
&gt; +class Clipboard;
&gt; +class Clipboard;

Double Clipboard.

&gt; Source/WebCore/platform/mac/PasteboardImpl.h:44
&gt; +class Range;
&gt; +class ArchiveResource;

Please sort these alphabetically.

&gt; Source/WebCore/platform/mac/PasteboardImpl.h:51
&gt; +class PasteboardImpl : public RefCounted&lt;PasteboardImpl&gt; {
&gt; +public:
&gt; +    virtual ~PasteboardImpl() { };
&gt; +    virtual NSArray* readTypes() = 0;

Will we need to switch implementations at runtime? Otherwise, an abstract interface is a wrong idiom to use. I think that we normally use strategies to switch between WK1 and WK2 implementations.

&gt; Source/WebCore/platform/mac/PasteboardImpl.h:69
&gt; +class PasteboardImplWK1: public PasteboardImpl {

The approach being unusual is reflected in the naming - we don&apos;t have any other class with WK1 in the name.

&gt; Source/WebCore/platform/mac/PasteboardImplWK1.mm:115
&gt; +    if (string == nil)

Should be just &quot;if (string)&quot; per WebKit coding style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547352</commentid>
    <comment_count>3</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-01 14:03:37 -0800</bug_when>
    <thetext>
&gt; Will we need to switch implementations at runtime? Otherwise, an abstract interface is a wrong idiom to use. I think that we normally use strategies to switch between WK1 and WK2 implementations.
&gt; 
I spoke with Sam about this and agreed on the use of strategies. It is a simple change from the existing implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548191</commentid>
    <comment_count>4</comment_count>
      <attachid>125197</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-02 15:24:56 -0800</bug_when>
    <thetext>Created attachment 125197
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548280</commentid>
    <comment_count>5</comment_count>
      <attachid>125197</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-02-02 17:36:45 -0800</bug_when>
    <thetext>Comment on attachment 125197
Patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        writeSelectionForTypes has been left to support Mac OSX services.

s/Mac OSX/OS X/

&gt; Source/WebCore/platform/Pasteboard.h:-84
&gt; +    // This is required to support Mac OSX services.
&gt;      void writeSelectionForTypes(NSArray* pasteboardTypes, Range* selectedRange, bool canSmartCopyOrDelete, Frame*);
&gt; -    void writeURLForTypes(NSArray* types, const KURL&amp;, const String&amp; titleStr, Frame*);

s/Mac OSX/OS X/

I&apos;m not sure if I fully understand why one of the two methods needed for services can be moved, but not another.

&gt; Source/WebCore/platform/mac/DragDataMac.mm:168
&gt; +    // FIXME: using the editorClient to call into webkit, for now, since 
&gt; +    // calling webkit_canonicalize from WebCore involves migrating a sizable amount of 
&gt; +    // helper code that should either be done in a separate patch or figured out in another way.

s/webkit/WebKit/.

Why do we need WebKit to canonicalize a URL? Normally, KURL does that.

&gt; Source/WebCore/platform/mac/DragDataMac.mm:187
&gt; +        // FIXME: Maybe it makes more sense to allow multiple files and only use the first one?

This is something Jon Lee would have an opinion about.

&gt; Source/WebCore/platform/mac/PasteboardMac.mm:380
&gt; -PassRefPtr&lt;DocumentFragment&gt; Pasteboard::documentFragmentWithRtf(Frame* frame, NSString* pboardType)
&gt; +static PassRefPtr&lt;DocumentFragment&gt; documentFragmentWithRtf(Frame* frame, NSString* pboardType, NSPasteboard* pasteboard)

You can consider fixing coding style when touching code like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550349</commentid>
    <comment_count>6</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-06 15:24:39 -0800</bug_when>
    <thetext>Thanks for the review!

&gt; &gt; Source/WebCore/platform/Pasteboard.h:-84
&gt; &gt; +    // This is required to support Mac OSX services.
&gt; &gt;      void writeSelectionForTypes(NSArray* pasteboardTypes, Range* selectedRange, bool canSmartCopyOrDelete, Frame*);
&gt; &gt; -    void writeURLForTypes(NSArray* types, const KURL&amp;, const String&amp; titleStr, Frame*);
&gt; 
&gt; I&apos;m not sure if I fully understand why one of the two methods needed for services can be moved, but not another.
To support Mac OS X services we need to implement the NSServicesRequests protocols that includes the writeSelectionToPasteboard:types: method.
writeSelectionForTypes is the WebCore method that implements that functionality.
writeURLForTypes was just an implementation choice in Pasteboard.
&gt; 
&gt; &gt; Source/WebCore/platform/mac/DragDataMac.mm:168
&gt; &gt; +    // FIXME: using the editorClient to call into webkit, for now, since 
&gt; &gt; +    // calling webkit_canonicalize from WebCore involves migrating a sizable amount of 
&gt; &gt; +    // helper code that should either be done in a separate patch or figured out in another way.
&gt; 
&gt; Why do we need WebKit to canonicalize a URL? Normally, KURL does that.

I don&apos;t know the answer to this question. I simply moved this code from Pasteboard to this file.
&gt; 
&gt; &gt; Source/WebCore/platform/mac/DragDataMac.mm:187
&gt; &gt; +        // FIXME: Maybe it makes more sense to allow multiple files and only use the first one?
&gt; 
&gt; This is something Jon Lee would have an opinion about.

Again, this is code moved from Pasteboard with the  relevant comments. Addressing this issue is beyond the scope of this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550361</commentid>
    <comment_count>7</comment_count>
      <attachid>125197</attachid>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2012-02-06 15:37:09 -0800</bug_when>
    <thetext>Comment on attachment 125197
Patch

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

&gt;&gt; Source/WebCore/platform/mac/DragDataMac.mm:187
&gt;&gt; +        // FIXME: Maybe it makes more sense to allow multiple files and only use the first one?
&gt; 
&gt; This is something Jon Lee would have an opinion about.

I think we should just restrict this to just one file and disallow multiple files. Otherwise using the suggested solution produces unpredictable results for the user. It&apos;s the same thing as another WK bug (can&apos;t find it right now), where dragging multiple files into a single-file input results in nothing being accepted, for the same reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550408</commentid>
    <comment_count>8</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-02-06 16:34:59 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/106872</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124986</attachid>
            <date>2012-02-01 12:10:43 -0800</date>
            <delta_ts>2012-02-02 15:24:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>pasteboardimpl.txt</filename>
            <type>text/plain</type>
            <size>42034</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjQ4MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY3IEBACisyMDEyLTAyLTAxICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmVmYWN0b3IgTWFjIHBsYXRm
b3JtIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXN0ZWJvYXJkIGNsYXNzLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjcKKyAgICAgICAgCisgICAg
ICAgIFRoZSBnb2FsIG9mIHRoaXMgY2hhbmdlIGlzIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlIHRv
IHRoZSBOU1Bhc3RlYm9hcmQKKyAgICAgICAgb2JqZWN0IGZyb20gdGhlIFBhc3RlYm9hcmQgY2xh
c3MgZm9yIHRoZSBNYWMgcGxhdGZvcm0gYW5kIHByb3ZpZGUgUGFzdGVib2FyZEltcGxXSzEKKyAg
ICAgICAgdGhhdCBkb2VzIHRoYXQuCisgICAgICAgIFRoaXMgaXMgYSBmaXJzdCBzdGVwIGluIHRo
ZSBkaXJlY3Rpb24gb2YgcmVtb3ZpbmcgTlNQYXN0ZWJvYXJkIGFjY2VzcyBmcm9tCisgICAgICAg
IHRoZSBXZWJQcm9jZXNzIGZvciBXZWJLaXQyIChodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NzcyNTkpCisgICAgICAgIGxlYXZpbmcgdGhlIFdlYktpdDEgYmVoYXZpb3Ig
dW5jaGFuZ2VkLgorICAgICAgICBDdXJyZW50bHkgb25seSBvbmUgaW1wbGVtZW50YXRpb24gaXMg
cHJvdmlkZWQgYW5kIGl0IGlzIHVzZWQgZm9yIGJvdGggV2ViS2l0MSBhbmQKKyAgICAgICAgV2Vi
S2l0Mi4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBO
byBuZXcgdGVzdHMsIHNpbmNlIHRoZXJlIGFyZSBubyBjaGFuZ2VzIGluIGZ1bmN0aW9uYWxpdHku
CisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVkIFBh
c3RlYm9hcmRJbXBsLmggYW5kCisgICAgICAgIFBhc3RlYm9hcmRJbXBsV0sxLm1tCisgICAgICAg
ICogcGxhdGZvcm0vUGFzdGVib2FyZC5oOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChQ
YXN0ZWJvYXJkKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvUGFzdGVib2FyZEltcGwuaDogQWRk
ZWQuIFByb3ZpZGVzIHRoZSBpbnRlZmFjZSB0bworICAgICAgICB0aGUgcGFzdGVib2FyZCBpbXBs
ZW1lbnRhdGlvbiBvYmplY3QuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9h
cmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmRJbXBsOjp+UGFzdGVib2FyZElt
cGwpOgorICAgICAgICAoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvUGFzdGVib2FyZEltcGxX
SzEubW06IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkSW1wbFdLMTo6UGFzdGVib2FyZEltcGxXSzEpOgorICAgICAgICAoV2ViQ29yZTo6UGFz
dGVib2FyZEltcGxXSzE6OnJlYWRUeXBlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJk
SW1wbFdLMTo6d3JpdGVUeXBlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkSW1wbFdL
MTo6cmVhZFdlYkFyY2hpdmUpOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZEltcGxXSzE6
OnJlYWRQYXRocyk6CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkSW1wbFdLMTo6cmVhZFN0
cmluZ0ZvclR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZEltcGxXSzE6OnJlYWRO
U0RhdGFGb3JUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmRJbXBsV0sxOjpyZWFk
TlNVUkwpOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZEltcGxXSzE6OmNsZWFyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmRJbXBsV0sxOjp3cml0ZVBsYWluVGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkSW1wbFdLMTo6d3JpdGVVUkxGb3JUeXBlcyk6CisgICAg
ICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkSW1wbFdLMTo6d3JpdGVSVEZERGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpQYXN0ZWJvYXJkSW1wbFdLMTo6cmVhZFJURkREYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OlBhc3RlYm9hcmRJbXBsV0sxOjp3cml0ZUNsaXBib2FyZCk6CisgICAgICAgIChXZWJD
b3JlOjpQYXN0ZWJvYXJkSW1wbFdLMTo6Y2FuU21hcnRSZXBsYWNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhc3RlYm9hcmRJbXBsV0sxOjp3cml0ZUltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
c3RlYm9hcmRJbXBsV0sxOjp3cml0ZURhdGFGb3JUeXBlcyk6CisgICAgICAgICogcGxhdGZvcm0v
bWFjL1Bhc3RlYm9hcmRNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpQYXN0
ZWJvYXJkKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNsZWFyKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlU2VsZWN0aW9uRm9yVHlwZXMpOgorICAgICAgICAo
V2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6d3JpdGVVUkxGb3JUeXBlcyk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlRmlsZVdyYXBwZXJBc1JURkRBdHRhY2htZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UpOgorICAgICAgICAo
V2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVDbGlwYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6Y2FuU21hcnRSZXBsYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9h
cmQ6OnBsYWluVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpkb2N1bWVudEZy
YWdtZW50V2l0aFJ0Zik6CisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpnZXRCZXN0VVJM
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnQpOgorCiAy
MDEyLTAyLTAxICBNYXggVnVqb3ZpYyAgPG12dWpvdmljQGFkb2JlLmNvbT4KIAogICAgICAgICBB
ZGQgc3VwcG9ydCBmb3IgZml4ZWQgYW5kIHBlcmNlbnQgbWluLXdpZHRoIG9uIHRoZSB0YWJsZSBl
bGVtZW50IGZvciB0YWJsZS1sYXlvdXQ6IGF1dG8gdG8KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDEwNjI4OSkK
KysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29y
a2luZyBjb3B5KQpAQCAtNTQ5OCw2ICs1NDk4LDcgQEAKIAkJQzUxNjBFRUExMDA0NTQzQTAwQTdD
RUUyIC8qIFN0b3JhZ2VBcmVhSW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBDNTE2MEVFODEwMDQ1NDNBMDBBN0NFRTIgLyogU3RvcmFnZUFyZWFJ
bXBsLmNwcCAqLzsgfTsKIAkJQzUxNjBFRUIxMDA0NTQzQTAwQTdDRUUyIC8qIFN0b3JhZ2VBcmVh
SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzUx
NjBFRTkxMDA0NTQzQTAwQTdDRUUyIC8qIFN0b3JhZ2VBcmVhSW1wbC5oICovOyB9OwogCQlDNTQ0
Mjc0QjExQTU3RTdBMDA2M0E3NDkgLyogRE9NU3RyaW5nTGlzdC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzU0NDI3NDkxMUE1N0U3QTAwNjNBNzQ5IC8q
IERPTVN0cmluZ0xpc3QuaCAqLzsgfTsKKwkJQzU1MEEyMzYxNEQ5QzlCQzAwRjE5RDY3IC8qIFBh
c3RlYm9hcmRJbXBsV0sxLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQzU1MEEyMzUxNEQ5QzlCQzAwRjE5RDY3IC8qIFBhc3RlYm9hcmRJbXBsV0sxLm1t
ICovOyB9OwogCQlDNTU2MTBGMTExQTcwNEVCMDBCODJEMjcgLyogRE9NU3RyaW5nTGlzdC5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNTU2MTBGMDEx
QTcwNEVCMDBCODJEMjcgLyogRE9NU3RyaW5nTGlzdC5jcHAgKi87IH07CiAJCUM1NUUzOEJGMTAw
NDBENUQwMEE1NkJEQiAvKiBTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzU1RTM4QkIxMDA0MEQ1RDAwQTU2QkRCIC8q
IFN0b3JhZ2VOYW1lc3BhY2VJbXBsLmggKi87IH07CiAJCUM1NUUzOEMwMTAwNDBENUQwMEE1NkJE
QiAvKiBTdG9yYWdlTmFtZXNwYWNlSW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBDNTVFMzhCQzEwMDQwRDVEMDBBNTZCREIgLyogU3RvcmFnZU5h
bWVzcGFjZUltcGwuY3BwICovOyB9OwpAQCAtMTI0MjEsNiArMTI0MjIsOCBAQAogCQlDNTM5MkQz
NDEzMjZBRDAxMDAwNDNEMzUgLyogSFRNTENvbnZlcnRlci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLm9iamNwcDsgcGF0aCA9IEhUTUxDb252ZXJ0ZXIubW07IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUM1NDQyNzQ5MTFBNTdFN0EwMDYzQTc0OSAvKiBET01TdHJpbmdMaXN0Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERPTVN0cmluZ0xpc3QuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzU0NDI3NEExMUE1N0U3QTAwNjNBNzQ5IC8qIERPTVN0
cmluZ0xpc3QuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IERPTVN0cmluZ0xpc3QuaWRsOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNTUwOUVDQTE0RDc2RjI0MDBGMTlENjcgLyog
UGFzdGVib2FyZEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUGFzdGVi
b2FyZEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzU1MEEyMzUxNEQ5QzlC
QzAwRjE5RDY3IC8qIFBhc3RlYm9hcmRJbXBsV0sxLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAub2JqY3BwOyBwYXRoID0gUGFzdGVib2FyZEltcGxXSzEubW07IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUM1NTYxMEYwMTFBNzA0RUIwMEI4MkQyNyAvKiBET01TdHJpbmdMaXN0LmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERPTVN0cmluZ0xpc3QuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTVFMzhCQjEwMDQwRDVEMDBBNTZCREIg
LyogU3RvcmFnZU5hbWVzcGFjZUltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gU3RvcmFnZU5hbWVzcGFjZUltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QzU1RTM4QkMxMDA0MEQ1RDAwQTU2QkRCIC8qIFN0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFN0b3JhZ2VOYW1lc3BhY2VJbXBsLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0OTc3LDYgKzE0OTgwLDggQEAKIAkJ
CQk5MzUwMEYzMTEzRkRFM0JFMDA5OUVDMjQgLyogTlNTY3JvbGxlckltcERldGFpbHMuaCAqLywK
IAkJCQk1MkY1MkUxMDE0QTAxMzRGMDBBQ0MzOTcgLyogTlNTY3JvbGxlckltcERldGFpbHMubW0g
Ki8sCiAJCQkJQTdEM0M1MjMwQjU3NkI0QjAwMkNBNDUwIC8qIFBhc3RlYm9hcmRIZWxwZXIuaCAq
LywKKwkJCQlDNTUwOUVDQTE0RDc2RjI0MDBGMTlENjcgLyogUGFzdGVib2FyZEltcGwuaCAqLywK
KwkJCQlDNTUwQTIzNTE0RDlDOUJDMDBGMTlENjcgLyogUGFzdGVib2FyZEltcGxXSzEubW0gKi8s
CiAJCQkJNEIyNzA5ODEwQUYyRTVFMDAwNjUxMjdGIC8qIFBhc3RlYm9hcmRNYWMubW0gKi8sCiAJ
CQkJQ0RFQTc2MkUxNDYwODRERTAwOEIzMUYxIC8qIFBsYXRmb3JtQ2xvY2tDQS5jcHAgKi8sCiAJ
CQkJQ0RFQTc2MkYxNDYwODRFRTAwOEIzMUYxIC8qIFBsYXRmb3JtQ2xvY2tDQS5oICovLApAQCAt
MjcwMzAsNiArMjcwMzUsNyBAQAogCQkJCUZENTM3MzUyMTM3QjY1MTgwMDAwOERDRSAvKiBaZXJv
UG9sZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1NzNEMTM0NzE0Q0UzOUZGMDA1N0FCQ0EgLyog
SW5zcGVjdG9yVHlwZUJ1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDcyMEIwQTAxNEQz
MzIzNTAwNjQyOTU1IC8qIEdlbmVyaWNFdmVudFF1ZXVlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJ
CUM1NTBBMjM2MTREOUM5QkMwMEYxOUQ2NyAvKiBQYXN0ZWJvYXJkSW1wbFdLMS5tbSBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwogCQl9OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vUGFzdGVib2FyZC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL1Bhc3RlYm9hcmQuaAkocmV2aXNpb24g
MTA2Mjg5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vUGFzdGVib2FyZC5oCSh3b3JraW5n
IGNvcHkpCkBAIC01Nyw2ICs1NywxMCBAQCB0eXBlZGVmIHN0cnVjdCBIV05EX18qIEhXTkQ7CiAj
aW5jbHVkZSAiUGFzdGVib2FyZFByaXZhdGUuaCIKICNlbmRpZgogCisjaWYgUExBVEZPUk0oTUFD
KQorI2luY2x1ZGUgIlBhc3RlYm9hcmRJbXBsLmgiCisjZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNv
cmUgewogCiAjaWYgUExBVEZPUk0oTUFDKQpAQCAtNjUsNiArNjksNyBAQCBleHRlcm4gTlNTdHJp
bmcgKldlYlNtYXJ0UGFzdGVQYm9hcmRUeXBlCiBleHRlcm4gTlNTdHJpbmcgKldlYlVSTE5hbWVQ
Ym9hcmRUeXBlOwogZXh0ZXJuIE5TU3RyaW5nICpXZWJVUkxQYm9hcmRUeXBlOwogZXh0ZXJuIE5T
U3RyaW5nICpXZWJVUkxzV2l0aFRpdGxlc1Bib2FyZFR5cGU7CitjbGFzcyBQYXN0ZWJvYXJkSW1w
bDsKICNlbmRpZgogCiBjbGFzcyBDbGlwYm9hcmQ7CkBAIC03NSw3ICs4MCw3IEBAIGNsYXNzIEtV
Ukw7CiBjbGFzcyBOb2RlOwogY2xhc3MgUmFuZ2U7CiBjbGFzcyBBcmNoaXZlUmVzb3VyY2U7Ci0g
ICAgCisKIGNsYXNzIFBhc3RlYm9hcmQgewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFBhc3Rl
Ym9hcmQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKQEAgLTExNCw3ICsxMTks
NyBAQCBwcml2YXRlOgogICAgIFBhc3RlYm9hcmQoKTsKIAogI2lmIFBMQVRGT1JNKE1BQykKLSAg
ICBSZXRhaW5QdHI8TlNQYXN0ZWJvYXJkPiBtX3Bhc3RlYm9hcmQ7CisgICAgUmVmUHRyPFBhc3Rl
Ym9hcmRJbXBsPiBtX3Bhc3RlYm9hcmRJbXBsOwogICAgIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gZG9jdW1lbnRGcmFnbWVudFdpdGhJbWFnZVJlc291cmNlKEZyYW1lKiBmcmFtZSwgUGFz
c1JlZlB0cjxBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlKTsKICAgICBQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IGRvY3VtZW50RnJhZ21lbnRXaXRoUnRmKEZyYW1lKiBmcmFtZSwgTlNTdHJp
bmcqIHBib2FyZFR5cGUpOwogICAgIE5TVVJMICpnZXRCZXN0VVJMKEZyYW1lICopOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1Bhc3RlYm9hcmRJbXBsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1Bhc3RlYm9hcmRJbXBsLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvUGFzdGVib2FyZEltcGwuaAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFBhc3RlYm9hcmRJ
bXBsX2gKKyNkZWZpbmUgUGFzdGVib2FyZEltcGxfaAorCisjaWYgUExBVEZPUk0oTUFDKQorCisj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworT0JKQ19DTEFTUyBOU0F0dHJpYnV0ZWRTdHJp
bmc7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ2xpcGJvYXJkOworY2xhc3MgQ2xp
cGJvYXJkOworY2xhc3MgRG9jdW1lbnRGcmFnbWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgS1VS
TDsKK2NsYXNzIE5vZGU7CitjbGFzcyBSYW5nZTsKK2NsYXNzIEFyY2hpdmVSZXNvdXJjZTsKK2Ns
YXNzIEltYWdlOworY2xhc3MgTGVnYWN5V2ViQXJjaGl2ZTsKKworY2xhc3MgUGFzdGVib2FyZElt
cGwgOiBwdWJsaWMgUmVmQ291bnRlZDxQYXN0ZWJvYXJkSW1wbD4geworcHVibGljOgorICAgIHZp
cnR1YWwgflBhc3RlYm9hcmRJbXBsKCkgeyB9OworICAgIHZpcnR1YWwgTlNBcnJheSogcmVhZFR5
cGVzKCkgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxMZWdhY3lXZWJBcmNoaXZlPiByZWFk
V2ViQXJjaGl2ZSgpID0gMDsKKyAgICB2aXJ0dWFsIE5TQXJyYXkqIHJlYWRQYXRocygpID0gMDsK
KyAgICB2aXJ0dWFsIE5TU3RyaW5nKiByZWFkU3RyaW5nRm9yVHlwZShOU1N0cmluZyogcGJvYXJk
VHlwZSkgPSAwOworICAgIHZpcnR1YWwgTlNEYXRhKiByZWFkTlNEYXRhRm9yVHlwZShOU1N0cmlu
ZyogcGJvYXJkVHlwZSkgPSAwOworICAgIHZpcnR1YWwgTlNVUkwqIHJlYWROU1VSTCgpID0gMDsK
KyAgICB2aXJ0dWFsIE5TQXR0cmlidXRlZFN0cmluZyogcmVhZFJURkREYXRhKE5TU3RyaW5nKiBw
Ym9hcmRUeXBlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlVHlwZXMoTlNBcnJheSogdHlw
ZXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVVUkxGb3JUeXBlcyhOU0FycmF5KiB0eXBl
cywgTlNTdHJpbmcqIHVzZXJWaXNpYmxlU3RyaW5nLCBOU1N0cmluZyogdGl0bGUsIGNvbnN0IFN0
cmluZyYgdGl0bGVTdHIsIE5TVVJMKiBjb2NvYVVSTCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCB3
cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcmKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRl
UlRGRERhdGEoTlNBdHRyaWJ1dGVkU3RyaW5nKikgPSAwOworICAgIHZpcnR1YWwgdm9pZCB3cml0
ZUNsaXBib2FyZChDbGlwYm9hcmQqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlSW1hZ2Uo
SW1hZ2UqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlRGF0YUZvclR5cGVzKE5TQXJyYXkq
IHR5cGVzLCBOU0RhdGEqIGFyY2hpdmVEYXRhLCBOU0F0dHJpYnV0ZWRTdHJpbmcqIGF0dHJpYnV0
ZWRTdHJpbmcsIE5TQXR0cmlidXRlZFN0cmluZyogc2ltcGxlQXR0cmlidXRlZFN0cmluZywgTlNT
dHJpbmcqIHRleHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSA9IDA7CisgICAgdmly
dHVhbCBib29sIGNhblNtYXJ0UmVwbGFjZSgpID0gMDsKK307CisKK2NsYXNzIFBhc3RlYm9hcmRJ
bXBsV0sxOiBwdWJsaWMgUGFzdGVib2FyZEltcGwgeworcHVibGljOgorICAgIFBhc3RlYm9hcmRJ
bXBsV0sxKGNvbnN0IFN0cmluZyYgcGFzdGVib2FyZE5hbWUpOworICAgIHZpcnR1YWwgTlNBcnJh
eSogcmVhZFR5cGVzKCk7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPExlZ2FjeVdlYkFyY2hpdmU+
IHJlYWRXZWJBcmNoaXZlKCk7CisgICAgdmlydHVhbCBOU0FycmF5KiByZWFkUGF0aHMoKTsKKyAg
ICB2aXJ0dWFsIE5TU3RyaW5nKiByZWFkU3RyaW5nRm9yVHlwZShOU1N0cmluZyogcGJvYXJkVHlw
ZSk7CisgICAgdmlydHVhbCBOU0RhdGEqIHJlYWROU0RhdGFGb3JUeXBlKE5TU3RyaW5nKiBwYm9h
cmRUeXBlKTsKKyAgICB2aXJ0dWFsIE5TVVJMKiByZWFkTlNVUkwoKTsKKyAgICB2aXJ0dWFsIE5T
QXR0cmlidXRlZFN0cmluZyogcmVhZFJURkREYXRhKE5TU3RyaW5nKiBwYm9hcmRUeXBlKTsKKyAg
ICAKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVUeXBlcyhOU0FycmF5KiB0eXBlcyk7CisgICAgdmly
dHVhbCB2b2lkIHdyaXRlVVJMRm9yVHlwZXMoTlNBcnJheSogdHlwZXMsIE5TU3RyaW5nKiB1c2Vy
VmlzaWJsZVN0cmluZywgTlNTdHJpbmcqIHRpdGxlLCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBO
U1VSTCogY29jb2FVUkwpOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVBsYWluVGV4dChjb25zdCBT
dHJpbmcmKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVSVEZERGF0YShOU0F0dHJpYnV0ZWRTdHJp
bmcqKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVDbGlwYm9hcmQoQ2xpcGJvYXJkKik7CisgICAg
dmlydHVhbCB2b2lkIHdyaXRlSW1hZ2UoSW1hZ2UqKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVE
YXRhRm9yVHlwZXMoTlNBcnJheSogdHlwZXMsIE5TRGF0YSogYXJjaGl2ZURhdGEsIE5TQXR0cmli
dXRlZFN0cmluZyogYXR0cmlidXRlZFN0cmluZywgTlNBdHRyaWJ1dGVkU3RyaW5nKiBzaW1wbGVB
dHRyaWJ1dGVkU3RyaW5nLCBOU1N0cmluZyogdGV4dCk7CisgICAgdmlydHVhbCB2b2lkIGNsZWFy
KCk7CisgICAgdmlydHVhbCBib29sIGNhblNtYXJ0UmVwbGFjZSgpOworICAgIAorICAgIFJldGFp
blB0cjxOU1Bhc3RlYm9hcmQ+IG1fcGFzdGVib2FyZDsKK307ICAgIAorCit9CisjZW5kaWYgLy8g
UExBVEZPUk0oTUFDKQorCisjZW5kaWYgLy8gIVBhc3RlYm9hcmRJbXBsX2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9QYXN0ZWJvYXJkSW1wbFdLMS5tbQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvUGFzdGVib2FyZEltcGxXSzEubW0JKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvUGFzdGVib2FyZEltcGxXSzEu
bW0JKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEyIEFwcGxlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW1wb3J0ICJj
b25maWcuaCIKKworI2ltcG9ydCAiQ2xpcGJvYXJkTWFjLmgiCisjaW1wb3J0ICJMZWdhY3lXZWJB
cmNoaXZlLmgiCisjaW1wb3J0ICJQYXN0ZWJvYXJkLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworUGFzdGVib2FyZEltcGxXSzE6OlBhc3RlYm9hcmRJbXBsV0sxKGNvbnN0IFN0cmluZyYgcGFz
dGVib2FyZE5hbWUpCisgICAgOiBtX3Bhc3RlYm9hcmQoW05TUGFzdGVib2FyZCBwYXN0ZWJvYXJk
V2l0aE5hbWU6cGFzdGVib2FyZE5hbWVdKQoreworfQorCitOU0FycmF5KiBQYXN0ZWJvYXJkSW1w
bFdLMTo6cmVhZFR5cGVzKCkKK3sKKyAgICByZXR1cm4gW21fcGFzdGVib2FyZC5nZXQoKSB0eXBl
c107Cit9CisKK3ZvaWQgUGFzdGVib2FyZEltcGxXSzE6OndyaXRlVHlwZXMoTlNBcnJheSogdHlw
ZXMpCit7CisgICAgW21fcGFzdGVib2FyZC5nZXQoKSBkZWNsYXJlVHlwZXM6dHlwZXMgb3duZXI6
bmlsXTsKK30KKworUGFzc1JlZlB0cjxMZWdhY3lXZWJBcmNoaXZlPiBQYXN0ZWJvYXJkSW1wbFdL
MTo6cmVhZFdlYkFyY2hpdmUoKQoreworICAgIHJldHVybiBMZWdhY3lXZWJBcmNoaXZlOjpjcmVh
dGUoS1VSTCgpLCBTaGFyZWRCdWZmZXI6OndyYXBOU0RhdGEoW21fcGFzdGVib2FyZC5nZXQoKSBk
YXRhRm9yVHlwZTpXZWJBcmNoaXZlUGJvYXJkVHlwZV0pLmdldCgpKTsKK30KKworTlNBcnJheSog
UGFzdGVib2FyZEltcGxXSzE6OnJlYWRQYXRocygpCit7CisgICAgcmV0dXJuIFttX3Bhc3RlYm9h
cmQuZ2V0KCkgcHJvcGVydHlMaXN0Rm9yVHlwZTpOU0ZpbGVuYW1lc1Bib2FyZFR5cGVdOworfQor
CitOU1N0cmluZyogUGFzdGVib2FyZEltcGxXSzE6OnJlYWRTdHJpbmdGb3JUeXBlKE5TU3RyaW5n
KiBwYm9hcmRUeXBlKQoreworICAgIHJldHVybiBbbV9wYXN0ZWJvYXJkLmdldCgpIHN0cmluZ0Zv
clR5cGU6cGJvYXJkVHlwZV07Cit9CisKK05TRGF0YSogUGFzdGVib2FyZEltcGxXSzE6OnJlYWRO
U0RhdGFGb3JUeXBlKE5TU3RyaW5nKiBwYm9hcmRUeXBlKQoreworICAgIHJldHVybiBbbV9wYXN0
ZWJvYXJkLmdldCgpIGRhdGFGb3JUeXBlOnBib2FyZFR5cGVdOyAgICAKK30KKworTlNVUkwqIFBh
c3RlYm9hcmRJbXBsV0sxOjpyZWFkTlNVUkwoKQoreworICAgIHJldHVybiBbTlNVUkwgVVJMRnJv
bVBhc3RlYm9hcmQ6bV9wYXN0ZWJvYXJkLmdldCgpXTsKK30KKwordm9pZCBQYXN0ZWJvYXJkSW1w
bFdLMTo6Y2xlYXIoKQoreworICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgZGVjbGFyZVR5cGVzOltO
U0FycmF5IGFycmF5XSBvd25lcjpuaWxdOworfQorCit2b2lkIFBhc3RlYm9hcmRJbXBsV0sxOjp3
cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcmIHRleHQpCit7CisgICAgW21fcGFzdGVib2FyZC5n
ZXQoKSBkZWNsYXJlVHlwZXM6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0Ok5TU3RyaW5nUGJvYXJk
VHlwZV0gb3duZXI6bmlsXTsKKyAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldFN0cmluZzp0ZXh0
IGZvclR5cGU6TlNTdHJpbmdQYm9hcmRUeXBlXTsKK30KKwordm9pZCBQYXN0ZWJvYXJkSW1wbFdL
MTo6d3JpdGVVUkxGb3JUeXBlcyhOU0FycmF5KiB0eXBlcywgTlNTdHJpbmcqIHVzZXJWaXNpYmxl
U3RyaW5nLCBOU1N0cmluZyogdGl0bGUsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIE5TVVJMKiBj
b2NvYVVSTCkKK3sKKyAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIGRlY2xhcmVUeXBlczp0eXBlcyBv
d25lcjpuaWxdOworICAgIAorICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6V2ViVVJMc1dp
dGhUaXRsZXNQYm9hcmRUeXBlXSkKKyAgICAgICAgW21fcGFzdGVib2FyZC5nZXQoKSBzZXRQcm9w
ZXJ0eUxpc3Q6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpbTlNBcnJheSBhcnJheVdpdGhPYmpl
Y3Q6dXNlclZpc2libGVTdHJpbmddLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFtOU0FycmF5IGFycmF5V2l0aE9iamVjdDooTlNTdHJpbmcqKXRpdGxlU3Ry
LnN0cmlwV2hpdGVTcGFjZSgpXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBuaWxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JU
eXBlOldlYlVSTHNXaXRoVGl0bGVzUGJvYXJkVHlwZV07CisgICAgaWYgKFt0eXBlcyBjb250YWlu
c09iamVjdDpOU1VSTFBib2FyZFR5cGVdKQorICAgICAgICBbY29jb2FVUkwgd3JpdGVUb1Bhc3Rl
Ym9hcmQ6bV9wYXN0ZWJvYXJkLmdldCgpXTsKKyAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0
OldlYlVSTFBib2FyZFR5cGVdKQorICAgICAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldFN0cmlu
Zzp1c2VyVmlzaWJsZVN0cmluZyBmb3JUeXBlOldlYlVSTFBib2FyZFR5cGVdOworICAgIGlmIChb
dHlwZXMgY29udGFpbnNPYmplY3Q6V2ViVVJMTmFtZVBib2FyZFR5cGVdKQorICAgICAgICBbbV9w
YXN0ZWJvYXJkLmdldCgpIHNldFN0cmluZzp0aXRsZSBmb3JUeXBlOldlYlVSTE5hbWVQYm9hcmRU
eXBlXTsKKyAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TU3RyaW5nUGJvYXJkVHlwZV0p
CisgICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0U3RyaW5nOnVzZXJWaXNpYmxlU3RyaW5n
IGZvclR5cGU6TlNTdHJpbmdQYm9hcmRUeXBlXTsKK30KKwordm9pZCBQYXN0ZWJvYXJkSW1wbFdL
MTo6d3JpdGVSVEZERGF0YShOU0F0dHJpYnV0ZWRTdHJpbmcqIHN0cmluZykKK3sKKyAgICBOU0Rh
dGEgKlJURkREYXRhID0gW3N0cmluZyBSVEZERnJvbVJhbmdlOk5TTWFrZVJhbmdlKDAsIFtzdHJp
bmcgbGVuZ3RoXSkgZG9jdW1lbnRBdHRyaWJ1dGVzOm5pbF07CisgICAgW21fcGFzdGVib2FyZC5n
ZXQoKSBzZXREYXRhOlJURkREYXRhIGZvclR5cGU6TlNSVEZEUGJvYXJkVHlwZV07Cit9CisKK05T
QXR0cmlidXRlZFN0cmluZyogUGFzdGVib2FyZEltcGxXSzE6OnJlYWRSVEZERGF0YShOU1N0cmlu
ZyogcGJvYXJkVHlwZSkKK3sKKyAgICBOU0F0dHJpYnV0ZWRTdHJpbmcqIHN0cmluZyA9IG5pbDsK
KyAgICBpZiAocGJvYXJkVHlwZSA9PSBOU1JURkRQYm9hcmRUeXBlKQorICAgICAgICBzdHJpbmcg
PSBbW05TQXR0cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEZEOlttX3Bhc3RlYm9hcmQu
Z2V0KCkgZGF0YUZvclR5cGU6TlNSVEZEUGJvYXJkVHlwZV0gZG9jdW1lbnRBdHRyaWJ1dGVzOk5V
TExdOworICAgIGlmIChzdHJpbmcgPT0gbmlsKQorICAgICAgICBzdHJpbmcgPSBbW05TQXR0cmli
dXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEY6W21fcGFzdGVib2FyZC5nZXQoKSBkYXRhRm9y
VHlwZTpOU1JURlBib2FyZFR5cGVdIGRvY3VtZW50QXR0cmlidXRlczpOVUxMXTsKKyAgICByZXR1
cm4gc3RyaW5nOworfQorCit2b2lkIFBhc3RlYm9hcmRJbXBsV0sxOjp3cml0ZUNsaXBib2FyZChD
bGlwYm9hcmQqIGNsaXBib2FyZCkKK3sKKyAgICBOU1Bhc3RlYm9hcmQqIHBhc3RlYm9hcmQgPSBz
dGF0aWNfY2FzdDxDbGlwYm9hcmRNYWMqPihjbGlwYm9hcmQpLT5wYXN0ZWJvYXJkKCk7CisgICAg
TlNBcnJheSogdHlwZXMgPSBbcGFzdGVib2FyZCB0eXBlc107CisgICAgCisgICAgW21fcGFzdGVi
b2FyZC5nZXQoKSBhZGRUeXBlczp0eXBlcyBvd25lcjpuaWxdOworICAgIGZvciAoTlNVSW50ZWdl
ciBpID0gMDsgaSA8IFt0eXBlcyBjb3VudF07IGkrKykgeworICAgICAgICBOU1N0cmluZyogdHlw
ZSA9IFt0eXBlcyBvYmplY3RBdEluZGV4OmldOworICAgICAgICBbbV9wYXN0ZWJvYXJkLmdldCgp
IHNldERhdGE6W3Bhc3RlYm9hcmQgZGF0YUZvclR5cGU6dHlwZV0gZm9yVHlwZTp0eXBlXTsKKyAg
ICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZEltcGxXSzE6OmNhblNtYXJ0UmVwbGFjZSgpCit7Cisg
ICAgcmV0dXJuIFtbbV9wYXN0ZWJvYXJkLmdldCgpIHR5cGVzXSBjb250YWluc09iamVjdDpXZWJT
bWFydFBhc3RlUGJvYXJkVHlwZV07Cit9CisKK3ZvaWQgUGFzdGVib2FyZEltcGxXSzE6OndyaXRl
SW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0YTpb
aW1hZ2UtPmdldE5TSW1hZ2UoKSBUSUZGUmVwcmVzZW50YXRpb25dIGZvclR5cGU6TlNUSUZGUGJv
YXJkVHlwZV07Cit9CisKK3ZvaWQgUGFzdGVib2FyZEltcGxXSzE6OndyaXRlRGF0YUZvclR5cGVz
KE5TQXJyYXkqIHR5cGVzLCBOU0RhdGEqIGFyY2hpdmVEYXRhLCBOU0F0dHJpYnV0ZWRTdHJpbmcq
IGF0dHJpYnV0ZWRTdHJpbmcsIE5TQXR0cmlidXRlZFN0cmluZyogc2ltcGxlQXR0cmlidXRlZFN0
cmluZywgTlNTdHJpbmcqIHRleHQpCit7CisgICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpX
ZWJBcmNoaXZlUGJvYXJkVHlwZV0pCisgICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0
YTphcmNoaXZlRGF0YSBmb3JUeXBlOldlYkFyY2hpdmVQYm9hcmRUeXBlXTsKKworICAgIGlmIChb
dHlwZXMgY29udGFpbnNPYmplY3Q6TlNSVEZEUGJvYXJkVHlwZV0pIHsKKyAgICAgICAgTlNEYXRh
ICpSVEZERGF0YSA9IFthdHRyaWJ1dGVkU3RyaW5nIFJURkRGcm9tUmFuZ2U6TlNNYWtlUmFuZ2Uo
MCwgW2F0dHJpYnV0ZWRTdHJpbmcgbGVuZ3RoXSkgZG9jdW1lbnRBdHRyaWJ1dGVzOm5pbF07Cisg
ICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0YTpSVEZERGF0YSBmb3JUeXBlOk5TUlRG
RFBib2FyZFR5cGVdOworICAgIH0KKworICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNS
VEZQYm9hcmRUeXBlXSkgeworICAgICAgICBOU0RhdGEgKlJURkRhdGEgPSBbc2ltcGxlQXR0cmli
dXRlZFN0cmluZyBSVEZGcm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3NpbXBsZUF0dHJpYnV0ZWRT
dHJpbmcgbGVuZ3RoXSkgZG9jdW1lbnRBdHRyaWJ1dGVzOm5pbF07CisgICAgICAgIFttX3Bhc3Rl
Ym9hcmQuZ2V0KCkgc2V0RGF0YTpSVEZEYXRhIGZvclR5cGU6TlNSVEZQYm9hcmRUeXBlXTsKKyAg
ICB9CisKKyAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TU3RyaW5nUGJvYXJkVHlwZV0p
CisgICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0U3RyaW5nOnRleHQgZm9yVHlwZTpOU1N0
cmluZ1Bib2FyZFR5cGVdOworCisgICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpXZWJTbWFy
dFBhc3RlUGJvYXJkVHlwZV0pCisgICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0YTpu
aWwgZm9yVHlwZTpXZWJTbWFydFBhc3RlUGJvYXJkVHlwZV07Cit9CisKK30KSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9QYXN0ZWJvYXJkTWFjLm1tCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9QYXN0ZWJvYXJkTWFjLm1tCShyZXZpc2lvbiAxMDYy
ODkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvUGFzdGVib2FyZE1hYy5tbQkod29y
a2luZyBjb3B5KQpAQCAtNTgsOSArNTgsNiBAQAogI2ltcG9ydCA8d3RmL1VudXNlZFBhcmFtLmg+
CiAjaW1wb3J0IDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgogCi1AaW50ZXJmYWNlIE5T
QXR0cmlidXRlZFN0cmluZyAoQXBwS2l0U2VjcmV0c0lLbm93QWJvdXQpCi0tIChpZClfaW5pdFdp
dGhET01SYW5nZTooRE9NUmFuZ2UgKilkb21SYW5nZTsKLUBlbmQKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAogLy8gRklYTUU6IEl0J3Mgbm90IGdyZWF0IHRvIGhhdmUgdGhlc2UgYm90aCBoZXJlIGFu
ZCBpbiBXZWJLaXQuCkBAIC0xMTgsMTQgKzExNSwxNCBAQCBQYXN0ZWJvYXJkKiBQYXN0ZWJvYXJk
OjpnZW5lcmFsUGFzdGVib2FyCiB9CiAKIFBhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoY29uc3QgU3Ry
aW5nJiBwYXN0ZWJvYXJkTmFtZSkKLSAgICA6IG1fcGFzdGVib2FyZChbTlNQYXN0ZWJvYXJkIHBh
c3RlYm9hcmRXaXRoTmFtZTpwYXN0ZWJvYXJkTmFtZV0pCiB7CiAgICAgQVNTRVJUKHBhc3RlYm9h
cmROYW1lKTsKKyAgICBtX3Bhc3RlYm9hcmRJbXBsID0gYWRvcHRSZWYobmV3IFBhc3RlYm9hcmRJ
bXBsV0sxKHBhc3RlYm9hcmROYW1lKSk7CiB9CiAKIHZvaWQgUGFzdGVib2FyZDo6Y2xlYXIoKQog
ewotICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgZGVjbGFyZVR5cGVzOltOU0FycmF5IGFycmF5XSBv
d25lcjpuaWxdOworICAgIG1fcGFzdGVib2FyZEltcGwtPmNsZWFyKCk7CiB9CiAKIHZvaWQgUGFz
dGVib2FyZDo6d3JpdGVTZWxlY3Rpb25Gb3JUeXBlcyhOU0FycmF5KiBwYXN0ZWJvYXJkVHlwZXMs
IFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9yRGVsZXRlLCBGcmFtZSog
ZnJhbWUpCkBAIC0xNDQsNjUgKzE0MSw0NSBAQCB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlU2VsZWN0
aW9uRm9yVHlwZXMoCiAgICAgTm9kZSogZW5jbG9zaW5nQW5jaG9yID0gZW5jbG9zaW5nTm9kZVdp
dGhUYWcoZmlyc3RQb3NpdGlvbkluTm9kZShjb21tb25BbmNlc3RvciksIEhUTUxOYW1lczo6YVRh
Zyk7CiAgICAgaWYgKGVuY2xvc2luZ0FuY2hvciAmJiBjb21wYXJlUG9zaXRpb25zKGZpcnN0UG9z
aXRpb25Jbk9yQmVmb3JlTm9kZShzZWxlY3RlZFJhbmdlLT5zdGFydFBvc2l0aW9uKCkuYW5jaG9y
Tm9kZSgpKSwgc2VsZWN0ZWRSYW5nZS0+c3RhcnRQb3NpdGlvbigpKSA+PSAwKQogICAgICAgICBz
ZWxlY3RlZFJhbmdlLT5zZXRTdGFydChlbmNsb3NpbmdBbmNob3IsIDAsIGVjKTsKLQotICAgIC8v
IFVzaW5nIGRpZmZlcmVudCBBUEkgZm9yIFdlYktpdCBhbmQgV2ViS2l0Mi4KKyAgICAKICAgICBO
U0F0dHJpYnV0ZWRTdHJpbmcgKmF0dHJpYnV0ZWRTdHJpbmcgPSBuaWw7Ci0gICAgaWYgKGZyYW1l
LT52aWV3KCktPnBsYXRmb3JtV2lkZ2V0KCkpCi0gICAgICAgIGF0dHJpYnV0ZWRTdHJpbmcgPSBb
W1tOU0F0dHJpYnV0ZWRTdHJpbmcgYWxsb2NdIF9pbml0V2l0aERPTVJhbmdlOmtpdChzZWxlY3Rl
ZFJhbmdlKV0gYXV0b3JlbGVhc2VdOwotI2lmbmRlZiBCVUlMRElOR19PTl9MRU9QQVJECi0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIEluIFdlYktpdDIgd2UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHdh
eSB0byBjcmVhdGUgdGhlIE5TQXR0cmlidXRlZFN0cmluZyBmcm9tIHRoZSBET01yYW5nZSB0aGF0
IGRvZXNuJ3QgcmVxdWlyZSBhY2Nlc3MgdG8gdGhlIFdlYlZpZXcuCi0gICAgICAgIFJldGFpblB0
cjxXZWJIVE1MQ29udmVydGVyPiBjb252ZXJ0ZXIoQWRvcHROUywgW1tXZWJIVE1MQ29udmVydGVy
IGFsbG9jXSBpbml0V2l0aERPTVJhbmdlOmtpdChzZWxlY3RlZFJhbmdlKV0pOwotICAgICAgICBp
ZiAoY29udmVydGVyKQotICAgICAgICAgICAgYXR0cmlidXRlZFN0cmluZyA9IFtjb252ZXJ0ZXIu
Z2V0KCkgYXR0cmlidXRlZFN0cmluZ107Ci0gICAgfQotI2VuZGlmCi0KKyAgICBSZXRhaW5QdHI8
V2ViSFRNTENvbnZlcnRlcj4gY29udmVydGVyKEFkb3B0TlMsIFtbV2ViSFRNTENvbnZlcnRlciBh
bGxvY10gaW5pdFdpdGhET01SYW5nZTpraXQoc2VsZWN0ZWRSYW5nZSldKTsKKyAgICBpZiAoY29u
dmVydGVyKQorICAgICAgICBhdHRyaWJ1dGVkU3RyaW5nID0gW2NvbnZlcnRlci5nZXQoKSBhdHRy
aWJ1dGVkU3RyaW5nXTsKKyAgICAKICAgICBOU0FycmF5ICp0eXBlcyA9IHBhc3RlYm9hcmRUeXBl
cyA/IHBhc3RlYm9hcmRUeXBlcyA6IHNlbGVjdGlvblBhc3RlYm9hcmRUeXBlcyhjYW5TbWFydENv
cHlPckRlbGV0ZSwgW2F0dHJpYnV0ZWRTdHJpbmcgY29udGFpbnNBdHRhY2htZW50c10pOwotICAg
IFttX3Bhc3RlYm9hcmQuZ2V0KCkgZGVjbGFyZVR5cGVzOnR5cGVzIG93bmVyOm5pbF07CisgICAg
bV9wYXN0ZWJvYXJkSW1wbC0+d3JpdGVUeXBlcyh0eXBlcyk7CiAgICAgZnJhbWUtPmVkaXRvcigp
LT5jbGllbnQoKS0+ZGlkU2V0U2VsZWN0aW9uVHlwZXNGb3JQYXN0ZWJvYXJkKCk7CiAgICAgCiAg
ICAgLy8gUHV0IEhUTUwgb24gdGhlIHBhc3RlYm9hcmQuCisgICAgUmV0YWluUHRyPENGRGF0YVJl
Zj4gZGF0YTsKKyAgICBSZWZQdHI8TGVnYWN5V2ViQXJjaGl2ZT4gYXJjaGl2ZTsKICAgICBpZiAo
W3R5cGVzIGNvbnRhaW5zT2JqZWN0OldlYkFyY2hpdmVQYm9hcmRUeXBlXSkgewotICAgICAgICBS
ZWZQdHI8TGVnYWN5V2ViQXJjaGl2ZT4gYXJjaGl2ZSA9IExlZ2FjeVdlYkFyY2hpdmU6OmNyZWF0
ZUZyb21TZWxlY3Rpb24oZnJhbWUpOwotICAgICAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiBkYXRh
ID0gYXJjaGl2ZSA/IGFyY2hpdmUtPnJhd0RhdGFSZXByZXNlbnRhdGlvbigpIDogMDsKLSAgICAg
ICAgW21fcGFzdGVib2FyZC5nZXQoKSBzZXREYXRhOihOU0RhdGEgKilkYXRhLmdldCgpIGZvclR5
cGU6V2ViQXJjaGl2ZVBib2FyZFR5cGVdOworICAgICAgICBhcmNoaXZlID0gTGVnYWN5V2ViQXJj
aGl2ZTo6Y3JlYXRlRnJvbVNlbGVjdGlvbihmcmFtZSk7CisgICAgICAgIGRhdGEgPSBhcmNoaXZl
ID8gYXJjaGl2ZS0+cmF3RGF0YVJlcHJlc2VudGF0aW9uKCkgOiAwOwogICAgIH0KICAgICAKICAg
ICAvLyBQdXQgdGhlIGF0dHJpYnV0ZWQgc3RyaW5nIG9uIHRoZSBwYXN0ZWJvYXJkIChSVEYvUlRG
RCBmb3JtYXQpLgotICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNSVEZEUGJvYXJkVHlw
ZV0pIHsKLSAgICAgICAgTlNEYXRhICpSVEZERGF0YSA9IFthdHRyaWJ1dGVkU3RyaW5nIFJURkRG
cm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW2F0dHJpYnV0ZWRTdHJpbmcgbGVuZ3RoXSkgZG9jdW1l
bnRBdHRyaWJ1dGVzOm5pbF07Ci0gICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0YTpS
VEZERGF0YSBmb3JUeXBlOk5TUlRGRFBib2FyZFR5cGVdOwotICAgIH0KLSAgICBpZiAoW3R5cGVz
IGNvbnRhaW5zT2JqZWN0Ok5TUlRGUGJvYXJkVHlwZV0pIHsKLSAgICAgICAgaWYgKFthdHRyaWJ1
dGVkU3RyaW5nIGNvbnRhaW5zQXR0YWNobWVudHNdKQotICAgICAgICAgICAgYXR0cmlidXRlZFN0
cmluZyA9IGF0dHJpYnV0ZWRTdHJpbmdCeVN0cmlwcGluZ0F0dGFjaG1lbnRDaGFyYWN0ZXJzKGF0
dHJpYnV0ZWRTdHJpbmcpOwotICAgICAgICBOU0RhdGEgKlJURkRhdGEgPSBbYXR0cmlidXRlZFN0
cmluZyBSVEZGcm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW2F0dHJpYnV0ZWRTdHJpbmcgbGVuZ3Ro
XSkgZG9jdW1lbnRBdHRyaWJ1dGVzOm5pbF07Ci0gICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkg
c2V0RGF0YTpSVEZEYXRhIGZvclR5cGU6TlNSVEZQYm9hcmRUeXBlXTsKLSAgICB9CiAgICAgCiAg
ICAgLy8gUHV0IHBsYWluIHN0cmluZyBvbiB0aGUgcGFzdGVib2FyZC4KKyAgICBOU011dGFibGVT
dHJpbmcgKnBsYWluVGV4dFN0cmluZyA9IG5pbDsKICAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2Jq
ZWN0Ok5TU3RyaW5nUGJvYXJkVHlwZV0pIHsKICAgICAgICAgLy8gTWFwICZuYnNwOyB0byBhIHBs
YWluIG9sZCBzcGFjZSBiZWNhdXNlIHRoaXMgaXMgYmV0dGVyIGZvciBzb3VyY2UgY29kZSwgb3Ro
ZXIgYnJvd3NlcnMgZG8gaXQsCiAgICAgICAgIC8vIGFuZCBiZWNhdXNlIEhUTUwgZm9yY2VzIHlv
dSB0byBkbyB0aGlzIGFueSB0aW1lIHlvdSB3YW50IHR3byBzcGFjZXMgaW4gYSByb3cuCiAgICAg
ICAgIFN0cmluZyB0ZXh0ID0gZnJhbWUtPmVkaXRvcigpLT5zZWxlY3RlZFRleHQoKTsKLSAgICAg
ICAgTlNNdXRhYmxlU3RyaW5nICpzID0gW1tbKE5TU3RyaW5nKil0ZXh0IGNvcHldIGF1dG9yZWxl
YXNlXSBtdXRhYmxlQ29weV07CisgICAgICAgIHBsYWluVGV4dFN0cmluZyA9IFtbWyhOU1N0cmlu
ZyopdGV4dCBjb3B5XSBhdXRvcmVsZWFzZV0gbXV0YWJsZUNvcHldOwogICAgICAgICAKICAgICAg
ICAgTlNTdHJpbmcgKk5vbkJyZWFraW5nU3BhY2VTdHJpbmcgPSBbTlNTdHJpbmcgc3RyaW5nV2l0
aENoYXJhY3RlcnM6Jm5vQnJlYWtTcGFjZSBsZW5ndGg6MV07Ci0gICAgICAgIFtzIHJlcGxhY2VP
Y2N1cnJlbmNlc09mU3RyaW5nOk5vbkJyZWFraW5nU3BhY2VTdHJpbmcgd2l0aFN0cmluZzpAIiAi
IG9wdGlvbnM6MCByYW5nZTpOU01ha2VSYW5nZSgwLCBbcyBsZW5ndGhdKV07Ci0gICAgICAgIFtt
X3Bhc3RlYm9hcmQuZ2V0KCkgc2V0U3RyaW5nOnMgZm9yVHlwZTpOU1N0cmluZ1Bib2FyZFR5cGVd
OwotICAgICAgICBbcyByZWxlYXNlXTsKKyAgICAgICAgW3BsYWluVGV4dFN0cmluZyByZXBsYWNl
T2NjdXJyZW5jZXNPZlN0cmluZzpOb25CcmVha2luZ1NwYWNlU3RyaW5nIHdpdGhTdHJpbmc6QCIg
IiBvcHRpb25zOjAgcmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3BsYWluVGV4dFN0cmluZyBsZW5ndGhd
KV07CiAgICAgfQogICAgIAotICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6V2ViU21hcnRQ
YXN0ZVBib2FyZFR5cGVdKSB7Ci0gICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0RGF0YTpu
aWwgZm9yVHlwZTpXZWJTbWFydFBhc3RlUGJvYXJkVHlwZV07Ci0gICAgfQorICAgIG1fcGFzdGVi
b2FyZEltcGwtPndyaXRlRGF0YUZvclR5cGVzKHR5cGVzLCAoTlNEYXRhKilkYXRhLmdldCgpLCBh
dHRyaWJ1dGVkU3RyaW5nLCBhdHRyaWJ1dGVkU3RyaW5nQnlTdHJpcHBpbmdBdHRhY2htZW50Q2hh
cmFjdGVycyhhdHRyaWJ1dGVkU3RyaW5nKSwgcGxhaW5UZXh0U3RyaW5nKTsKKyAgICBbcGxhaW5U
ZXh0U3RyaW5nIHJlbGVhc2VdOwogfQogCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0
KGNvbnN0IFN0cmluZyYgdGV4dCkKIHsKLSAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIGRlY2xhcmVU
eXBlczpbTlNBcnJheSBhcnJheVdpdGhPYmplY3Q6TlNTdHJpbmdQYm9hcmRUeXBlXSBvd25lcjpu
aWxdOwotICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0U3RyaW5nOnRleHQgZm9yVHlwZTpOU1N0
cmluZ1Bib2FyZFR5cGVdOworICAgIG1fcGFzdGVib2FyZEltcGwtPndyaXRlUGxhaW5UZXh0KHRl
eHQpOwogfQogICAgIAogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVNlbGVjdGlvbihSYW5nZSogc2Vs
ZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFydENvcHlPckRlbGV0ZSwgRnJhbWUqIGZyYW1lKQpAQCAt
MjE0LDE0ICsxOTEsMTIgQEAgdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVSTEZvclR5cGVzKE5TQXJy
YQogewogICAgIGlmICghV2ViQXJjaGl2ZVBib2FyZFR5cGUpCiAgICAgICAgIFBhc3RlYm9hcmQ6
OmdlbmVyYWxQYXN0ZWJvYXJkKCk7IC8vIEluaXRpYWxpemVzIHBhc3RlYm9hcmQgdHlwZXMuCi0g
ICAKLSAgICBpZiAoIXR5cGVzKSB7Ci0gICAgICAgIHR5cGVzID0gd3JpdGFibGVUeXBlc0ZvclVS
TCgpOwotICAgICAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIGRlY2xhcmVUeXBlczp0eXBlcyBvd25l
cjpuaWxdOwotICAgIH0KICAgICAKICAgICBBU1NFUlQoIXVybC5pc0VtcHR5KCkpOwotICAgIAor
CisgICAgaWYgKCF0eXBlcykKKyAgICAgICAgdHlwZXMgPSB3cml0YWJsZVR5cGVzRm9yVVJMKCk7
CisKICAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7CiAgICAgTlNTdHJpbmcgKnVzZXJWaXNpYmxl
U3RyaW5nID0gZnJhbWUtPmVkaXRvcigpLT5jbGllbnQoKS0+dXNlclZpc2libGVTdHJpbmcoY29j
b2FVUkwpOwogICAgIApAQCAtMjMxLDIyICsyMDYsMTAgQEAgdm9pZCBQYXN0ZWJvYXJkOjp3cml0
ZVVSTEZvclR5cGVzKE5TQXJyYQogICAgICAgICBpZiAoW3RpdGxlIGxlbmd0aF0gPT0gMCkKICAg
ICAgICAgICAgIHRpdGxlID0gdXNlclZpc2libGVTdHJpbmc7CiAgICAgfQotICAgICAgICAKLSAg
ICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0OldlYlVSTHNXaXRoVGl0bGVzUGJvYXJkVHlwZV0p
Ci0gICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0UHJvcGVydHlMaXN0OltOU0FycmF5IGFy
cmF5V2l0aE9iamVjdHM6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0OnVzZXJWaXNpYmxlU3RyaW5n
XSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05TQXJyYXkgYXJyYXlX
aXRoT2JqZWN0OihOU1N0cmluZyopdGl0bGVTdHIuc3RyaXBXaGl0ZVNwYWNlKCldLCAKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZm9yVHlwZTpXZWJVUkxzV2l0aFRpdGxlc1Bib2FyZFR5cGVdOwotICAgIGlmIChb
dHlwZXMgY29udGFpbnNPYmplY3Q6TlNVUkxQYm9hcmRUeXBlXSkKLSAgICAgICAgW2NvY29hVVJM
IHdyaXRlVG9QYXN0ZWJvYXJkOm1fcGFzdGVib2FyZC5nZXQoKV07Ci0gICAgaWYgKFt0eXBlcyBj
b250YWluc09iamVjdDpXZWJVUkxQYm9hcmRUeXBlXSkKLSAgICAgICAgW21fcGFzdGVib2FyZC5n
ZXQoKSBzZXRTdHJpbmc6dXNlclZpc2libGVTdHJpbmcgZm9yVHlwZTpXZWJVUkxQYm9hcmRUeXBl
XTsKLSAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0OldlYlVSTE5hbWVQYm9hcmRUeXBlXSkK
LSAgICAgICAgW21fcGFzdGVib2FyZC5nZXQoKSBzZXRTdHJpbmc6dGl0bGUgZm9yVHlwZTpXZWJV
UkxOYW1lUGJvYXJkVHlwZV07Ci0gICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU1N0cmlu
Z1Bib2FyZFR5cGVdKQotICAgICAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldFN0cmluZzp1c2Vy
VmlzaWJsZVN0cmluZyBmb3JUeXBlOk5TU3RyaW5nUGJvYXJkVHlwZV07Ci19CiAgICAgCisgICAg
bV9wYXN0ZWJvYXJkSW1wbC0+d3JpdGVVUkxGb3JUeXBlcyh0eXBlcywgdXNlclZpc2libGVTdHJp
bmcsIHRpdGxlLCB0aXRsZVN0ciwgY29jb2FVUkwpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6Ondy
aXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZy
YW1lKQogewogICAgIHdyaXRlVVJMRm9yVHlwZXMobmlsLCB1cmwsIHRpdGxlU3RyLCBmcmFtZSk7
CkBAIC0yNjgsNzcgKzIzMSw2MiBAQCBzdGF0aWMgTlNGaWxlV3JhcHBlciogZmlsZVdyYXBwZXJG
b3JJbWFnCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlRmlsZVdyYXBwZXJBc1JURkRBdHRhY2htZW50
KE5TRmlsZVdyYXBwZXIqIHdyYXBwZXIpCiB7CiAgICAgTlNUZXh0QXR0YWNobWVudCAqYXR0YWNo
bWVudCA9IFtbTlNUZXh0QXR0YWNobWVudCBhbGxvY10gaW5pdFdpdGhGaWxlV3JhcHBlcjp3cmFw
cGVyXTsKLSAgICAKICAgICBOU0F0dHJpYnV0ZWRTdHJpbmcgKnN0cmluZyA9IFtOU0F0dHJpYnV0
ZWRTdHJpbmcgYXR0cmlidXRlZFN0cmluZ1dpdGhBdHRhY2htZW50OmF0dGFjaG1lbnRdOwogICAg
IFthdHRhY2htZW50IHJlbGVhc2VdOwogICAgIAotICAgIE5TRGF0YSAqUlRGRERhdGEgPSBbc3Ry
aW5nIFJURkRGcm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3N0cmluZyBsZW5ndGhdKSBkb2N1bWVu
dEF0dHJpYnV0ZXM6bmlsXTsKLSAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldERhdGE6UlRGRERh
dGEgZm9yVHlwZTpOU1JURkRQYm9hcmRUeXBlXTsKKyAgICBtX3Bhc3RlYm9hcmRJbXBsLT53cml0
ZVJURkREYXRhKHN0cmluZyk7CiB9CiAKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShOb2Rl
KiBub2RlLCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUpCiB7CiAgICAgQVNT
RVJUKG5vZGUpOwotCisgICAgCiAgICAgaWYgKCEobm9kZS0+cmVuZGVyZXIoKSAmJiBub2RlLT5y
ZW5kZXJlcigpLT5pc0ltYWdlKCkpKQogICAgICAgICByZXR1cm47Ci0KKyAgICAKICAgICBGcmFt
ZSogZnJhbWUgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOwotCisgICAgCiAgICAgTlNVUkwg
KmNvY29hVVJMID0gdXJsOwogICAgIEFTU0VSVChjb2NvYVVSTCk7Ci0KKyAgICAKICAgICBSZW5k
ZXJJbWFnZSogcmVuZGVyZXIgPSB0b1JlbmRlckltYWdlKG5vZGUtPnJlbmRlcmVyKCkpOwogICAg
IENhY2hlZEltYWdlKiBjYWNoZWRJbWFnZSA9IHJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpOwogICAg
IGlmICghY2FjaGVkSW1hZ2UgfHwgY2FjaGVkSW1hZ2UtPmVycm9yT2NjdXJyZWQoKSkKICAgICAg
ICAgcmV0dXJuOwotCi0gICAgTlNBcnJheSogdHlwZXMgPSB3cml0YWJsZVR5cGVzRm9ySW1hZ2Uo
KTsKLSAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIGRlY2xhcmVUeXBlczp0eXBlcyBvd25lcjpuaWxd
OwotICAgIHdyaXRlVVJMRm9yVHlwZXModHlwZXMsIGNvY29hVVJMLCBuc1N0cmluZ05pbElmRW1w
dHkodGl0bGUpLCBmcmFtZSk7CisgICAgCisgICAgd3JpdGVVUkxGb3JUeXBlcyh3cml0YWJsZVR5
cGVzRm9ySW1hZ2UoKSwgY29jb2FVUkwsIG5zU3RyaW5nTmlsSWZFbXB0eSh0aXRsZSksIGZyYW1l
KTsKICAgICAKICAgICBJbWFnZSogaW1hZ2UgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJl
cihyZW5kZXJlcik7CiAgICAgQVNTRVJUKGltYWdlKTsKICAgICAKLSAgICBbbV9wYXN0ZWJvYXJk
LmdldCgpIHNldERhdGE6W2ltYWdlLT5nZXROU0ltYWdlKCkgVElGRlJlcHJlc2VudGF0aW9uXSBm
b3JUeXBlOk5TVElGRlBib2FyZFR5cGVdOwotCisgICAgbV9wYXN0ZWJvYXJkSW1wbC0+d3JpdGVJ
bWFnZShpbWFnZSk7CisgICAgCiAgICAgU3RyaW5nIE1JTUVUeXBlID0gY2FjaGVkSW1hZ2UtPnJl
c3BvbnNlKCkubWltZVR5cGUoKTsKICAgICBBU1NFUlQoTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBw
b3J0ZWRJbWFnZVJlc291cmNlTUlNRVR5cGUoTUlNRVR5cGUpKTsKLQorICAgIAogICAgIHdyaXRl
RmlsZVdyYXBwZXJBc1JURkRBdHRhY2htZW50KGZpbGVXcmFwcGVyRm9ySW1hZ2UoY2FjaGVkSW1h
Z2UsIGNvY29hVVJMKSk7CiB9CiAKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVDbGlwYm9hcmQoQ2xp
cGJvYXJkKiBjbGlwYm9hcmQpCiB7Ci0gICAgTlNQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gc3Rh
dGljX2Nhc3Q8Q2xpcGJvYXJkTWFjKj4oY2xpcGJvYXJkKS0+cGFzdGVib2FyZCgpOwotICAgIE5T
QXJyYXkqIHR5cGVzID0gW3Bhc3RlYm9hcmQgdHlwZXNdOwotCi0gICAgW21fcGFzdGVib2FyZC5n
ZXQoKSBhZGRUeXBlczp0eXBlcyBvd25lcjpuaWxdOwotICAgIGZvciAoTlNVSW50ZWdlciBpID0g
MDsgaSA8IFt0eXBlcyBjb3VudF07IGkrKykgewotICAgICAgICBOU1N0cmluZyogdHlwZSA9IFt0
eXBlcyBvYmplY3RBdEluZGV4OmldOwotICAgICAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldERh
dGE6W3Bhc3RlYm9hcmQgZGF0YUZvclR5cGU6dHlwZV0gZm9yVHlwZTp0eXBlXTsKLSAgICB9Cisg
ICAgbV9wYXN0ZWJvYXJkSW1wbC0+d3JpdGVDbGlwYm9hcmQoY2xpcGJvYXJkKTsKIH0KIAogYm9v
bCBQYXN0ZWJvYXJkOjpjYW5TbWFydFJlcGxhY2UoKQogewotICAgIHJldHVybiBbW21fcGFzdGVi
b2FyZC5nZXQoKSB0eXBlc10gY29udGFpbnNPYmplY3Q6V2ViU21hcnRQYXN0ZVBib2FyZFR5cGVd
OworICAgIHJldHVybiBtX3Bhc3RlYm9hcmRJbXBsLT5jYW5TbWFydFJlcGxhY2UoKTsKIH0KIAog
U3RyaW5nIFBhc3RlYm9hcmQ6OnBsYWluVGV4dChGcmFtZSogZnJhbWUpCiB7Ci0gICAgTlNBcnJh
eSAqdHlwZXMgPSBbbV9wYXN0ZWJvYXJkLmdldCgpIHR5cGVzXTsKKyAgICBOU0FycmF5ICp0eXBl
cyA9IG1fcGFzdGVib2FyZEltcGwtPnJlYWRUeXBlcygpOwogICAgIAogICAgIGlmIChbdHlwZXMg
Y29udGFpbnNPYmplY3Q6TlNTdHJpbmdQYm9hcmRUeXBlXSkKLSAgICAgICAgcmV0dXJuIFtbbV9w
YXN0ZWJvYXJkLmdldCgpIHN0cmluZ0ZvclR5cGU6TlNTdHJpbmdQYm9hcmRUeXBlXSBwcmVjb21w
b3NlZFN0cmluZ1dpdGhDYW5vbmljYWxNYXBwaW5nXTsKKyAgICAgICAgcmV0dXJuIFttX3Bhc3Rl
Ym9hcmRJbXBsLT5yZWFkU3RyaW5nRm9yVHlwZShOU1N0cmluZ1Bib2FyZFR5cGUpIHByZWNvbXBv
c2VkU3RyaW5nV2l0aENhbm9uaWNhbE1hcHBpbmddOwogICAgIAotICAgIE5TQXR0cmlidXRlZFN0
cmluZyAqYXR0cmlidXRlZFN0cmluZyA9IG5pbDsKKyAgICBOU0F0dHJpYnV0ZWRTdHJpbmcgKmF0
dHJpYnV0ZWRTdHJpbmcgPSBtX3Bhc3RlYm9hcmRJbXBsLT5yZWFkUlRGRERhdGEoTlNSVEZEUGJv
YXJkVHlwZSk7CiAgICAgTlNTdHJpbmcgKnN0cmluZzsKLQotICAgIGlmIChbdHlwZXMgY29udGFp
bnNPYmplY3Q6TlNSVEZEUGJvYXJkVHlwZV0pCi0gICAgICAgIGF0dHJpYnV0ZWRTdHJpbmcgPSBb
W05TQXR0cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEZEOlttX3Bhc3RlYm9hcmQuZ2V0
KCkgZGF0YUZvclR5cGU6TlNSVEZEUGJvYXJkVHlwZV0gZG9jdW1lbnRBdHRyaWJ1dGVzOk5VTExd
OwotICAgIGlmIChhdHRyaWJ1dGVkU3RyaW5nID09IG5pbCAmJiBbdHlwZXMgY29udGFpbnNPYmpl
Y3Q6TlNSVEZQYm9hcmRUeXBlXSkKLSAgICAgICAgYXR0cmlidXRlZFN0cmluZyA9IFtbTlNBdHRy
aWJ1dGVkU3RyaW5nIGFsbG9jXSBpbml0V2l0aFJURjpbbV9wYXN0ZWJvYXJkLmdldCgpIGRhdGFG
b3JUeXBlOk5TUlRGUGJvYXJkVHlwZV0gZG9jdW1lbnRBdHRyaWJ1dGVzOk5VTExdOworICAgIAog
ICAgIGlmIChhdHRyaWJ1dGVkU3RyaW5nICE9IG5pbCkgewogICAgICAgICBzdHJpbmcgPSBbW2F0
dHJpYnV0ZWRTdHJpbmcgc3RyaW5nXSBwcmVjb21wb3NlZFN0cmluZ1dpdGhDYW5vbmljYWxNYXBw
aW5nXTsKICAgICAgICAgW2F0dHJpYnV0ZWRTdHJpbmcgcmVsZWFzZV07CkBAIC0zNDYsMTMgKzI5
NCwxMyBAQCBTdHJpbmcgUGFzdGVib2FyZDo6cGxhaW5UZXh0KEZyYW1lKiBmcmFtCiAgICAgfQog
ICAgIAogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNGaWxlbmFtZXNQYm9hcmRUeXBl
XSkgewotICAgICAgICBzdHJpbmcgPSBbW1ttX3Bhc3RlYm9hcmQuZ2V0KCkgcHJvcGVydHlMaXN0
Rm9yVHlwZTpOU0ZpbGVuYW1lc1Bib2FyZFR5cGVdIGNvbXBvbmVudHNKb2luZWRCeVN0cmluZzpA
IlxuIl0gcHJlY29tcG9zZWRTdHJpbmdXaXRoQ2Fub25pY2FsTWFwcGluZ107CisgICAgICAgIHN0
cmluZyA9IFtbbV9wYXN0ZWJvYXJkSW1wbC0+cmVhZFBhdGhzKCkgY29tcG9uZW50c0pvaW5lZEJ5
U3RyaW5nOkAiXG4iXSBwcmVjb21wb3NlZFN0cmluZ1dpdGhDYW5vbmljYWxNYXBwaW5nXTsKICAg
ICAgICAgaWYgKHN0cmluZyAhPSBuaWwpCiAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAg
IH0KICAgICAKICAgICAKLSAgICBpZiAoTlNVUkwgKnVybCA9IFtOU1VSTCBVUkxGcm9tUGFzdGVi
b2FyZDptX3Bhc3RlYm9hcmQuZ2V0KCldKSB7CisgICAgaWYgKE5TVVJMICp1cmwgPSBtX3Bhc3Rl
Ym9hcmRJbXBsLT5yZWFkTlNVUkwoKSkgewogICAgICAgICAvLyBGSVhNRTogdXNpbmcgdGhlIGVk
aXRvckNsaWVudCB0byBjYWxsIGludG8gd2Via2l0LCBmb3Igbm93LCBzaW5jZSAKICAgICAgICAg
Ly8gY2FsbGluZyBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nIGZyb20gV2ViQ29yZSBpbnZvbHZlcyBt
aWdyYXRpbmcgYSBzaXphYmxlIHdlYiBvZiAKICAgICAgICAgLy8gaGVscGVyIGNvZGUgdGhhdCBz
aG91bGQgZWl0aGVyIGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXRjaCBvciBmaWd1cmVkIG91dCBp
biBhbm90aGVyIHdheS4KQEAgLTM2MCwxMSArMzA4LDEwIEBAIFN0cmluZyBQYXN0ZWJvYXJkOjpw
bGFpblRleHQoRnJhbWUqIGZyYW0KICAgICAgICAgaWYgKFtzdHJpbmcgbGVuZ3RoXSA+IDApCiAg
ICAgICAgICAgICByZXR1cm4gW3N0cmluZyBwcmVjb21wb3NlZFN0cmluZ1dpdGhDYW5vbmljYWxN
YXBwaW5nXTsKICAgICB9Ci0KICAgICAKICAgICByZXR1cm4gU3RyaW5nKCk7IAogfQotICAgIAor
CiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21l
bnRXaXRoSW1hZ2VSZXNvdXJjZShGcmFtZSogZnJhbWUsIFBhc3NSZWZQdHI8QXJjaGl2ZVJlc291
cmNlPiByZXNvdXJjZSkKIHsKICAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGxvYWRlciA9IGZyYW1l
LT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKSkKQEAgLTM5MCwxMSArMzM3LDcgQEAgUGFzc1Jl
ZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJkOgogICAgIGlmICghZnJhbWUgfHwgIWZy
YW1lLT5kb2N1bWVudCgpIHx8ICFmcmFtZS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkK
ICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBOU0F0dHJpYnV0ZWRTdHJpbmcgKnN0cmluZyA9IG5p
bDsKLSAgICBpZiAocGJvYXJkVHlwZSA9PSBOU1JURkRQYm9hcmRUeXBlKQotICAgICAgICBzdHJp
bmcgPSBbW05TQXR0cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEZEOlttX3Bhc3RlYm9h
cmQuZ2V0KCkgZGF0YUZvclR5cGU6TlNSVEZEUGJvYXJkVHlwZV0gZG9jdW1lbnRBdHRyaWJ1dGVz
Ok5VTExdOwotICAgIGlmIChzdHJpbmcgPT0gbmlsKQotICAgICAgICBzdHJpbmcgPSBbW05TQXR0
cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEY6W21fcGFzdGVib2FyZC5nZXQoKSBkYXRh
Rm9yVHlwZTpOU1JURlBib2FyZFR5cGVdIGRvY3VtZW50QXR0cmlidXRlczpOVUxMXTsKKyAgICBO
U0F0dHJpYnV0ZWRTdHJpbmcgKnN0cmluZyA9IG1fcGFzdGVib2FyZEltcGwtPnJlYWRSVEZERGF0
YShwYm9hcmRUeXBlKTsKICAgICBpZiAoc3RyaW5nID09IG5pbCkKICAgICAgICAgcmV0dXJuIG5p
bDsKIApAQCAtNDM0LDE0ICszNzcsMTQgQEAgc3RhdGljIE5TVVJMKiB1bmlxdWVVUkxXaXRoUmVs
YXRpdmVQYXJ0KAogCiBOU1VSTCAqUGFzdGVib2FyZDo6Z2V0QmVzdFVSTChGcmFtZSogZnJhbWUp
CiB7Ci0gICAgTlNBcnJheSAqdHlwZXMgPSBbbV9wYXN0ZWJvYXJkLmdldCgpIHR5cGVzXTsKLQor
ICAgIE5TQXJyYXkgKnR5cGVzID0gbV9wYXN0ZWJvYXJkSW1wbC0+cmVhZFR5cGVzKCk7CisgICAg
CiAgICAgLy8gRklYTUU6IHVzaW5nIHRoZSBlZGl0b3JDbGllbnQgdG8gY2FsbCBpbnRvIHdlYmtp
dCwgZm9yIG5vdywgc2luY2UgCiAgICAgLy8gY2FsbGluZyB3ZWJraXRfY2Fub25pY2FsaXplIGZy
b20gV2ViQ29yZSBpbnZvbHZlcyBtaWdyYXRpbmcgYSBzaXphYmxlIGFtb3VudCBvZiAKICAgICAv
LyBoZWxwZXIgY29kZSB0aGF0IHNob3VsZCBlaXRoZXIgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHBh
dGNoIG9yIGZpZ3VyZWQgb3V0IGluIGFub3RoZXIgd2F5LgogICAgIAogICAgIGlmIChbdHlwZXMg
Y29udGFpbnNPYmplY3Q6TlNVUkxQYm9hcmRUeXBlXSkgewotICAgICAgICBOU1VSTCAqVVJMRnJv
bVBhc3RlYm9hcmQgPSBbTlNVUkwgVVJMRnJvbVBhc3RlYm9hcmQ6bV9wYXN0ZWJvYXJkLmdldCgp
XTsKKyAgICAgICAgTlNVUkwgKlVSTEZyb21QYXN0ZWJvYXJkID0gbV9wYXN0ZWJvYXJkSW1wbC0+
cmVhZE5TVVJMKCk7CiAgICAgICAgIE5TU3RyaW5nICpzY2hlbWUgPSBbVVJMRnJvbVBhc3RlYm9h
cmQgc2NoZW1lXTsKICAgICAgICAgaWYgKFtzY2hlbWUgaXNFcXVhbFRvU3RyaW5nOkAiaHR0cCJd
IHx8IFtzY2hlbWUgaXNFcXVhbFRvU3RyaW5nOkAiaHR0cHMiXSkgewogICAgICAgICAgICAgcmV0
dXJuIGZyYW1lLT5lZGl0b3IoKS0+Y2xpZW50KCktPmNhbm9uaWNhbGl6ZVVSTChVUkxGcm9tUGFz
dGVib2FyZCk7CkBAIC00NDksMTQgKzM5MiwxNCBAQCBOU1VSTCAqUGFzdGVib2FyZDo6Z2V0QmVz
dFVSTChGcmFtZSogZnJhCiAgICAgfQogICAgIAogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmpl
Y3Q6TlNTdHJpbmdQYm9hcmRUeXBlXSkgewotICAgICAgICBOU1N0cmluZyAqVVJMU3RyaW5nID0g
W21fcGFzdGVib2FyZC5nZXQoKSBzdHJpbmdGb3JUeXBlOk5TU3RyaW5nUGJvYXJkVHlwZV07Cisg
ICAgICAgIE5TU3RyaW5nICpVUkxTdHJpbmcgPSBtX3Bhc3RlYm9hcmRJbXBsLT5yZWFkU3RyaW5n
Rm9yVHlwZShOU1N0cmluZ1Bib2FyZFR5cGUpOwogICAgICAgICBOU1VSTCAqVVJMID0gZnJhbWUt
PmVkaXRvcigpLT5jbGllbnQoKS0+Y2Fub25pY2FsaXplVVJMU3RyaW5nKFVSTFN0cmluZyk7CiAg
ICAgICAgIGlmIChVUkwpCiAgICAgICAgICAgICByZXR1cm4gVVJMOwogICAgIH0KICAgICAKICAg
ICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TRmlsZW5hbWVzUGJvYXJkVHlwZV0pIHsKLSAg
ICAgICAgTlNBcnJheSAqZmlsZXMgPSBbbV9wYXN0ZWJvYXJkLmdldCgpIHByb3BlcnR5TGlzdEZv
clR5cGU6TlNGaWxlbmFtZXNQYm9hcmRUeXBlXTsKKyAgICAgICAgTlNBcnJheSAqZmlsZXMgPSBt
X3Bhc3RlYm9hcmRJbXBsLT5yZWFkUGF0aHMoKTsKICAgICAgICAgLy8gRklYTUU6IE1heWJlIGl0
IG1ha2VzIG1vcmUgc2Vuc2UgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZXMgYW5kIG9ubHkgdXNlIHRo
ZSBmaXJzdCBvbmU/CiAgICAgICAgIGlmIChbZmlsZXMgY291bnRdID09IDEpIHsKICAgICAgICAg
ICAgIE5TU3RyaW5nICpmaWxlID0gW2ZpbGVzIG9iamVjdEF0SW5kZXg6MF07CkBAIC00NzcsMTIg
KzQyMCwxMiBAQCBTdHJpbmcgUGFzdGVib2FyZDo6YXNVUkwoRnJhbWUqIGZyYW1lKQogCiBQYXNz
UmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnQoRnJh
bWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93UGxhaW5UZXh0
LCBib29sJiBjaG9zZVBsYWluVGV4dCkKIHsKLSAgICBOU0FycmF5ICp0eXBlcyA9IFttX3Bhc3Rl
Ym9hcmQuZ2V0KCkgdHlwZXNdOworICAgIE5TQXJyYXkgKnR5cGVzID0gbV9wYXN0ZWJvYXJkSW1w
bC0+cmVhZFR5cGVzKCk7CiAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50Owog
ICAgIGNob3NlUGxhaW5UZXh0ID0gZmFsc2U7Ci0KKyAgICAKICAgICBpZiAoW3R5cGVzIGNvbnRh
aW5zT2JqZWN0OldlYkFyY2hpdmVQYm9hcmRUeXBlXSkgewotICAgICAgICBSZWZQdHI8TGVnYWN5
V2ViQXJjaGl2ZT4gY29yZUFyY2hpdmUgPSBMZWdhY3lXZWJBcmNoaXZlOjpjcmVhdGUoS1VSTCgp
LCBTaGFyZWRCdWZmZXI6OndyYXBOU0RhdGEoW21fcGFzdGVib2FyZC5nZXQoKSBkYXRhRm9yVHlw
ZTpXZWJBcmNoaXZlUGJvYXJkVHlwZV0pLmdldCgpKTsKKyAgICAgICAgUmVmUHRyPExlZ2FjeVdl
YkFyY2hpdmU+IGNvcmVBcmNoaXZlID0gbV9wYXN0ZWJvYXJkSW1wbC0+cmVhZFdlYkFyY2hpdmUo
KTsKICAgICAgICAgaWYgKGNvcmVBcmNoaXZlKSB7CiAgICAgICAgICAgICBSZWZQdHI8QXJjaGl2
ZVJlc291cmNlPiBtYWluUmVzb3VyY2UgPSBjb3JlQXJjaGl2ZS0+bWFpblJlc291cmNlKCk7CiAg
ICAgICAgICAgICBpZiAobWFpblJlc291cmNlKSB7CkBAIC00OTgsMjAgKzQ0MSwyMCBAQCBQYXNz
UmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6CiAgICAgICAgICAgICAgICAgICAg
IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGZyYW1lLT5kb2N1bWVudCgpLCBt
YXJrdXBTdHJpbmcsIG1haW5SZXNvdXJjZS0+dXJsKCksIEZyYWdtZW50U2NyaXB0aW5nTm90QWxs
b3dlZCk7CiAgICAgICAgICAgICAgICAgICAgIFttYXJrdXBTdHJpbmcgcmVsZWFzZV07CiAgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmIChNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZEltYWdl
TUlNRVR5cGUoTUlNRVR5cGUpKQotICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZG9jdW1l
bnRGcmFnbWVudFdpdGhJbWFnZVJlc291cmNlKGZyYW1lLCBtYWluUmVzb3VyY2UpOyAgICAgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZG9jdW1lbnRGcmFn
bWVudFdpdGhJbWFnZVJlc291cmNlKGZyYW1lLCBtYWluUmVzb3VyY2UpOyAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYWdtZW50KQog
ICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKICAgICB9IAotCisgICAgCiAg
ICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU0ZpbGVuYW1lc1Bib2FyZFR5cGVdKSB7Ci0g
ICAgICAgIE5TQXJyYXkqIHBhdGhzID0gW21fcGFzdGVib2FyZC5nZXQoKSBwcm9wZXJ0eUxpc3RG
b3JUeXBlOk5TRmlsZW5hbWVzUGJvYXJkVHlwZV07CisgICAgICAgIE5TQXJyYXkqIHBhdGhzID0g
bV9wYXN0ZWJvYXJkSW1wbC0+cmVhZFBhdGhzKCk7CiAgICAgICAgIE5TRW51bWVyYXRvciogZW51
bWVyYXRvciA9IFtwYXRocyBvYmplY3RFbnVtZXJhdG9yXTsKICAgICAgICAgTlNTdHJpbmcqIHBh
dGg7CiAgICAgICAgIFZlY3RvcjwgUmVmUHRyPE5vZGU+ID4gcmVmTm9kZXNWZWN0b3I7CiAgICAg
ICAgIFZlY3RvcjxOb2RlKj4gbm9kZXNWZWN0b3I7Ci0KKyAgICAgICAgCiAgICAgICAgIHdoaWxl
ICgocGF0aCA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSAhPSBuaWwpIHsKICAgICAgICAgICAg
IC8vIE5vbi1pbWFnZSBmaWxlIHR5cGVzOyBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nIGlzIGFwcHJv
cHJpYXRlIGhlcmUgYmVjYXVzZSB0aGlzIHdpbGwKICAgICAgICAgICAgIC8vIGJlIHBhc3RlZCBh
cyB2aXNpYmxlIHRleHQuCkBAIC01MjQsOSArNDY3LDkgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBQYXN0ZWJvYXJkOgogICAgICAgICBpZiAoZnJhZ21lbnQgJiYgZnJhZ21lbnQtPmZp
cnN0Q2hpbGQoKSkKICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7CiAgICAg
fQotCisgICAgCiAgICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU0hUTUxQYm9hcmRUeXBl
XSkgewotICAgICAgICBOU1N0cmluZyAqSFRNTFN0cmluZyA9IFttX3Bhc3RlYm9hcmQuZ2V0KCkg
c3RyaW5nRm9yVHlwZTpOU0hUTUxQYm9hcmRUeXBlXTsKKyAgICAgICAgTlNTdHJpbmcgKkhUTUxT
dHJpbmcgPSBtX3Bhc3RlYm9hcmRJbXBsLT5yZWFkU3RyaW5nRm9yVHlwZShOU0hUTUxQYm9hcmRU
eXBlKTsKICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBNaWNyb3NvZnQncyBIVE1M
IHBhc3RlYm9hcmQgZGF0YSB3b3JrLiBTZWUgMzc3ODc4NS4KICAgICAgICAgaWYgKFtIVE1MU3Ry
aW5nIGhhc1ByZWZpeDpAIlZlcnNpb246Il0pIHsKICAgICAgICAgICAgIE5TUmFuZ2UgcmFuZ2Ug
PSBbSFRNTFN0cmluZyByYW5nZU9mU3RyaW5nOkAiPGh0bWwiIG9wdGlvbnM6TlNDYXNlSW5zZW5z
aXRpdmVTZWFyY2hdOwpAQCAtNTM4LDM3ICs0ODEsMzcgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBQYXN0ZWJvYXJkOgogICAgICAgICAgICAgKGZyYWdtZW50ID0gY3JlYXRlRnJhZ21l
bnRGcm9tTWFya3VwKGZyYW1lLT5kb2N1bWVudCgpLCBIVE1MU3RyaW5nLCAiIiwgRnJhZ21lbnRT
Y3JpcHRpbmdOb3RBbGxvd2VkKSkpCiAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFz
ZSgpOwogICAgIH0KLQorICAgIAogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNSVEZE
UGJvYXJkVHlwZV0gJiYKICAgICAgICAgKGZyYWdtZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhS
dGYoZnJhbWUsIE5TUlRGRFBib2FyZFR5cGUpKSkKLSAgICAgICByZXR1cm4gZnJhZ21lbnQucmVs
ZWFzZSgpOwotCisgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7CisgICAgCiAgICAg
aWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU1JURlBib2FyZFR5cGVdICYmCiAgICAgICAgIChm
cmFnbWVudCA9IGRvY3VtZW50RnJhZ21lbnRXaXRoUnRmKGZyYW1lLCBOU1JURlBib2FyZFR5cGUp
KSkKICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKLQorICAgIAogICAgIGlmIChb
dHlwZXMgY29udGFpbnNPYmplY3Q6TlNUSUZGUGJvYXJkVHlwZV0gJiYKLSAgICAgICAgKGZyYWdt
ZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhJbWFnZVJlc291cmNlKGZyYW1lLCBBcmNoaXZlUmVz
b3VyY2U6OmNyZWF0ZShTaGFyZWRCdWZmZXI6OndyYXBOU0RhdGEoW1tbbV9wYXN0ZWJvYXJkLmdl
dCgpIGRhdGFGb3JUeXBlOk5TVElGRlBib2FyZFR5cGVdIGNvcHldIGF1dG9yZWxlYXNlXSksIHVu
aXF1ZVVSTFdpdGhSZWxhdGl2ZVBhcnQoQCJpbWFnZS50aWZmIiksICJpbWFnZS90aWZmIiwgIiIs
ICIiKSkpKQorICAgICAgICAoZnJhZ21lbnQgPSBkb2N1bWVudEZyYWdtZW50V2l0aEltYWdlUmVz
b3VyY2UoZnJhbWUsIEFyY2hpdmVSZXNvdXJjZTo6Y3JlYXRlKFNoYXJlZEJ1ZmZlcjo6d3JhcE5T
RGF0YShbW21fcGFzdGVib2FyZEltcGwtPnJlYWROU0RhdGFGb3JUeXBlKE5TVElGRlBib2FyZFR5
cGUpIGNvcHldIGF1dG9yZWxlYXNlXSksIHVuaXF1ZVVSTFdpdGhSZWxhdGl2ZVBhcnQoQCJpbWFn
ZS50aWZmIiksICJpbWFnZS90aWZmIiwgIiIsICIiKSkpKQogICAgICAgICByZXR1cm4gZnJhZ21l
bnQucmVsZWFzZSgpOwotCisgICAgCiAgICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU1BE
RlBib2FyZFR5cGVdICYmCi0gICAgICAgIChmcmFnbWVudCA9IGRvY3VtZW50RnJhZ21lbnRXaXRo
SW1hZ2VSZXNvdXJjZShmcmFtZSwgQXJjaGl2ZVJlc291cmNlOjpjcmVhdGUoU2hhcmVkQnVmZmVy
Ojp3cmFwTlNEYXRhKFtbW21fcGFzdGVib2FyZC5nZXQoKSBkYXRhRm9yVHlwZTpOU1BERlBib2Fy
ZFR5cGVdIGNvcHldIGF1dG9yZWxlYXNlXSksIHVuaXF1ZVVSTFdpdGhSZWxhdGl2ZVBhcnQoQCJh
cHBsaWNhdGlvbi5wZGYiKSwgImFwcGxpY2F0aW9uL3BkZiIsICIiLCAiIikpKSkKKyAgICAgICAg
KGZyYWdtZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhJbWFnZVJlc291cmNlKGZyYW1lLCBBcmNo
aXZlUmVzb3VyY2U6OmNyZWF0ZShTaGFyZWRCdWZmZXI6OndyYXBOU0RhdGEoW1ttX3Bhc3RlYm9h
cmRJbXBsLT5yZWFkTlNEYXRhRm9yVHlwZShOU1BERlBib2FyZFR5cGUpIGNvcHldIGF1dG9yZWxl
YXNlXSksIHVuaXF1ZVVSTFdpdGhSZWxhdGl2ZVBhcnQoQCJhcHBsaWNhdGlvbi5wZGYiKSwgImFw
cGxpY2F0aW9uL3BkZiIsICIiLCAiIikpKSkKICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVh
c2UoKTsKLQorICAgIAogI2lmZGVmIEJVSUxESU5HX09OX0xFT1BBUkQKICAgICBpZiAoW3R5cGVz
IGNvbnRhaW5zT2JqZWN0Ok5TUElDVFBib2FyZFR5cGVdICYmCi0gICAgICAgIChmcmFnbWVudCA9
IGRvY3VtZW50RnJhZ21lbnRXaXRoSW1hZ2VSZXNvdXJjZShmcmFtZSwgQXJjaGl2ZVJlc291cmNl
OjpjcmVhdGUoU2hhcmVkQnVmZmVyOjp3cmFwTlNEYXRhKFtbW21fcGFzdGVib2FyZC5nZXQoKSBk
YXRhRm9yVHlwZTpOU1BJQ1RQYm9hcmRUeXBlXSBjb3B5XSBhdXRvcmVsZWFzZV0pLCB1bmlxdWVV
UkxXaXRoUmVsYXRpdmVQYXJ0KEAiaW1hZ2UucGljdCIpLCAiaW1hZ2UvcGljdCIsICIiLCAiIikp
KSkKKyAgICAgICAgKGZyYWdtZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhJbWFnZVJlc291cmNl
KGZyYW1lLCBBcmNoaXZlUmVzb3VyY2U6OmNyZWF0ZShTaGFyZWRCdWZmZXI6OndyYXBOU0RhdGEo
W1ttX3Bhc3RlYm9hcmRJbXBsLT5yZWFkTlNEYXRhRm9yVHlwZShOU1BJQ1RQYm9hcmRUeXBlKSBj
b3B5XSBhdXRvcmVsZWFzZV0pLCB1bmlxdWVVUkxXaXRoUmVsYXRpdmVQYXJ0KEAiaW1hZ2UucGlj
dCIpLCAiaW1hZ2UvcGljdCIsICIiLCAiIikpKSkKICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJl
bGVhc2UoKTsKICNlbmRpZgotCisgICAgCiAgICAgLy8gT25seSAxMC41IGFuZCBoaWdoZXIgc3Vw
cG9ydCBzZXR0aW5nIGFuZCByZXRyaWV2aW5nIHBhc3RlYm9hcmQgdHlwZXMgd2l0aCBVVElzLCBi
dXQgd2UgZG9uJ3QgYmVsaWV2ZQogICAgIC8vIHRoYXQgYW55IGFwcGxpY2F0aW9ucyBvbiBUaWdl
ciBwdXQgdHlwZXMgZm9yIHdoaWNoIHdlIG9ubHkgaGF2ZSBhIFVUSSwgbGlrZSBQTkcsIG9uIHRo
ZSBwYXN0ZWJvYXJkLgogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6KE5TU3RyaW5nKilr
VVRUeXBlUE5HXSAmJgotICAgICAgICAoZnJhZ21lbnQgPSBkb2N1bWVudEZyYWdtZW50V2l0aElt
YWdlUmVzb3VyY2UoZnJhbWUsIEFyY2hpdmVSZXNvdXJjZTo6Y3JlYXRlKFNoYXJlZEJ1ZmZlcjo6
d3JhcE5TRGF0YShbW1ttX3Bhc3RlYm9hcmQuZ2V0KCkgZGF0YUZvclR5cGU6KE5TU3RyaW5nKilr
VVRUeXBlUE5HXSBjb3B5XSBhdXRvcmVsZWFzZV0pLCB1bmlxdWVVUkxXaXRoUmVsYXRpdmVQYXJ0
KEAiaW1hZ2UucG5nIiksICJpbWFnZS9wbmciLCAiIiwgIiIpKSkpCisgICAgICAgIChmcmFnbWVu
dCA9IGRvY3VtZW50RnJhZ21lbnRXaXRoSW1hZ2VSZXNvdXJjZShmcmFtZSwgQXJjaGl2ZVJlc291
cmNlOjpjcmVhdGUoU2hhcmVkQnVmZmVyOjp3cmFwTlNEYXRhKFtbbV9wYXN0ZWJvYXJkSW1wbC0+
cmVhZE5TRGF0YUZvclR5cGUoKE5TU3RyaW5nKilrVVRUeXBlUE5HKSBjb3B5XSBhdXRvcmVsZWFz
ZV0pLCB1bmlxdWVVUkxXaXRoUmVsYXRpdmVQYXJ0KEAiaW1hZ2UucG5nIiksICJpbWFnZS9wbmci
LCAiIiwgIiIpKSkpCiAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7Ci0KKyAgICAK
ICAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TVVJMUGJvYXJkVHlwZV0pIHsKLSAgICAg
ICAgTlNVUkwgKlVSTCA9IFtOU1VSTCBVUkxGcm9tUGFzdGVib2FyZDptX3Bhc3RlYm9hcmQuZ2V0
KCldOworICAgICAgICBOU1VSTCAqVVJMID0gbV9wYXN0ZWJvYXJkSW1wbC0+cmVhZE5TVVJMKCk7
CiAgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOwogICAgICAg
ICBBU1NFUlQoZG9jdW1lbnQpOwogICAgICAgICBpZiAoIWRvY3VtZW50KQpAQCAtNTc3LDcgKzUy
MCw3IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gUGFzdGVib2FyZDoKICAgICAgICAg
TlNTdHJpbmcgKlVSTFN0cmluZyA9IFtVUkwgYWJzb2x1dGVTdHJpbmddOyAvLyBPcmlnaW5hbCBk
YXRhIGlzIEFTQ0lJLW9ubHksIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJlY29tcG9zZS4KICAg
ICAgICAgaWYgKFtVUkxTdHJpbmcgbGVuZ3RoXSA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIG5p
bDsKLSAgICAgICAgTlNTdHJpbmcgKlVSTFRpdGxlU3RyaW5nID0gW1ttX3Bhc3RlYm9hcmQuZ2V0
KCkgc3RyaW5nRm9yVHlwZTpXZWJVUkxOYW1lUGJvYXJkVHlwZV0gcHJlY29tcG9zZWRTdHJpbmdX
aXRoQ2Fub25pY2FsTWFwcGluZ107CisgICAgICAgIE5TU3RyaW5nICpVUkxUaXRsZVN0cmluZyA9
IFttX3Bhc3RlYm9hcmRJbXBsLT5yZWFkU3RyaW5nRm9yVHlwZShXZWJVUkxOYW1lUGJvYXJkVHlw
ZSkgcHJlY29tcG9zZWRTdHJpbmdXaXRoQ2Fub25pY2FsTWFwcGluZ107CiAgICAgICAgIEV4Y2Vw
dGlvbkNvZGUgZWM7CiAgICAgICAgIGFuY2hvci0+c2V0QXR0cmlidXRlKEhUTUxOYW1lczo6aHJl
ZkF0dHIsIFVSTFN0cmluZyk7CiAgICAgICAgIGFuY2hvci0+YXBwZW5kQ2hpbGQoZG9jdW1lbnQt
PmNyZWF0ZVRleHROb2RlKFVSTFRpdGxlU3RyaW5nKSwgZWMpOwpAQCAtNTg3LDEzICs1MzAsMTMg
QEAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJkOgogICAgICAgICAgICAg
cmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIAogICAg
IGlmIChhbGxvd1BsYWluVGV4dCAmJiBbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNTdHJpbmdQYm9h
cmRUeXBlXSkgewogICAgICAgICBjaG9zZVBsYWluVGV4dCA9IHRydWU7Ci0gICAgICAgIGZyYWdt
ZW50ID0gY3JlYXRlRnJhZ21lbnRGcm9tVGV4dChjb250ZXh0LmdldCgpLCBbW21fcGFzdGVib2Fy
ZC5nZXQoKSBzdHJpbmdGb3JUeXBlOk5TU3RyaW5nUGJvYXJkVHlwZV0gcHJlY29tcG9zZWRTdHJp
bmdXaXRoQ2Fub25pY2FsTWFwcGluZ10pOworICAgICAgICBmcmFnbWVudCA9IGNyZWF0ZUZyYWdt
ZW50RnJvbVRleHQoY29udGV4dC5nZXQoKSwgW21fcGFzdGVib2FyZEltcGwtPnJlYWRTdHJpbmdG
b3JUeXBlKE5TU3RyaW5nUGJvYXJkVHlwZSkgcHJlY29tcG9zZWRTdHJpbmdXaXRoQ2Fub25pY2Fs
TWFwcGluZ10pOwogICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwogICAgIH0KLQor
ICAgIAogICAgIHJldHVybiAwOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125197</attachid>
            <date>2012-02-02 15:24:56 -0800</date>
            <delta_ts>2012-02-06 15:37:09 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>pasteboardcleanup2.txt</filename>
            <type>text/plain</type>
            <size>15924</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjU5MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM3IEBACisyMDEyLTAyLTAyICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmVmYWN0b3IgTWFjIHBsYXRm
b3JtIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXN0ZWJvYXJkIGNsYXNzLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjcKKyAgICAgICAgCisgICAg
ICAgIFRoZSBnb2FsIG9mIHRoaXMgY2hhbmdlIGlzIHRvIHJlbW92ZSB0aGUgbWFqb3JpdHkgb2Yg
dGhlIG1ldGhvZHMgaW4KKyAgICAgICAgdGhlIGNsYXNzIGludGVyZmFjZSB0aGF0IGFyZSBNYWMg
c3BlY2lmaWMuCisgICAgICAgIHdyaXRlU2VsZWN0aW9uRm9yVHlwZXMgaGFzIGJlZW4gbGVmdCB0
byBzdXBwb3J0IE1hYyBPU1ggc2VydmljZXMuCisgICAgICAgIFNvbWUgb2YgdGhlIG1ldGhvZHMg
aGF2ZSBiZWVuIHR1cm5lZCBpbnRvIHN0YXRpYyBmdW5jdGlvbnMuCisgICAgICAgIFRoZSBtZXRo
b2QgYXNVUkwgd2FzIGJlaW5nIHVzZWQgb25seSBieSB0aGUgRHJhZ0RhdGEgY2xhc3MgYW5kIGl0
cworICAgICAgICBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBtb3ZlZCB0aGVyZS4KKyAgICAgICAg
VGhpcyBpcyBhIGZpcnN0IHN0ZXAgaW4gdGhlIGRpcmVjdGlvbiBvZiByZW1vdmluZyBOU1Bhc3Rl
Ym9hcmQgYWNjZXNzIGZyb20KKyAgICAgICAgdGhlIFdlYlByb2Nlc3MgZm9yIFdlYktpdDIgKGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NzI1OSkKKyAgICAgICAgbGVh
dmluZyB0aGUgV2ViS2l0MSBiZWhhdmlvciB1bmNoYW5nZWQuCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiBObyBjaGFuZ2VzIGlu
IGJlaGF2aW9yLgorCisgICAgICAgICogcGxhdGZvcm0vUGFzdGVib2FyZC5oOiBSZW1vdmVkIG1v
c3Qgb2YgdGhlIE1hYyBzcGVjaWZpYyBtZXRob2RzLgorICAgICAgICAqIHBsYXRmb3JtL21hYy9D
bGlwYm9hcmRNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpDbGlwYm9hcmRNYWM6OndyaXRlUmFu
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkTWFjOjp3cml0ZVVSTCk6CisgICAgICAg
ICogcGxhdGZvcm0vbWFjL0RyYWdEYXRhTWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0Rh
dGE6OmFzVVJMKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvUGFzdGVib2FyZE1hYy5tbToKKyAg
ICAgICAgKFdlYkNvcmU6OndyaXRlVVJMRm9yVHlwZXMpOgorICAgICAgICAoV2ViQ29yZTo6UGFz
dGVib2FyZDo6d3JpdGVVUkwpOgorICAgICAgICAoV2ViQ29yZTo6d3JpdGVGaWxlV3JhcHBlckFz
UlRGREF0dGFjaG1lbnQpOiBOb3cgYSBzdGF0aWMgZnVuY3Rpb24uCisgICAgICAgIChXZWJDb3Jl
OjpQYXN0ZWJvYXJkOjp3cml0ZUltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmRvY3VtZW50RnJh
Z21lbnRXaXRoSW1hZ2VSZXNvdXJjZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6ZG9jdW1l
bnRGcmFnbWVudFdpdGhSdGYpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6
OmRvY3VtZW50RnJhZ21lbnQpOgorCiAyMDEyLTAyLTAyICBKb24gTGVlICA8am9ubGVlQGFwcGxl
LmNvbT4KIAogICAgICAgICBDbGVhciBzaG93biBub3RpZmljYXRpb25zIHdoZW4gY29udGV4dCBp
cyBubyBsb25nZXIgYWN0aXZlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJv
YXJkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vUGFzdGVib2FyZC5o
CShyZXZpc2lvbiAxMDYyODkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJk
LmgJKHdvcmtpbmcgY29weSkKQEAgLTgwLDkgKzgwLDggQEAgY2xhc3MgUGFzdGVib2FyZCB7CiAg
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUGFzdGVib2FyZCk7IFdURl9NQUtFX0ZBU1RfQUxMT0NB
VEVEOwogcHVibGljOgogI2lmIFBMQVRGT1JNKE1BQykKKyAgICAvLyBUaGlzIGlzIHJlcXVpcmVk
IHRvIHN1cHBvcnQgTWFjIE9TWCBzZXJ2aWNlcy4KICAgICB2b2lkIHdyaXRlU2VsZWN0aW9uRm9y
VHlwZXMoTlNBcnJheSogcGFzdGVib2FyZFR5cGVzLCBSYW5nZSogc2VsZWN0ZWRSYW5nZSwgYm9v
bCBjYW5TbWFydENvcHlPckRlbGV0ZSwgRnJhbWUqKTsKLSAgICB2b2lkIHdyaXRlVVJMRm9yVHlw
ZXMoTlNBcnJheSogdHlwZXMsIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBG
cmFtZSopOwotCiAgICAgUGFzdGVib2FyZChjb25zdCBTdHJpbmcmIHBhc3RlYm9hcmROYW1lKTsK
ICNlbmRpZgogICAgIApAQCAtOTEsMTAgKzkwLDYgQEAgcHVibGljOgogICAgIHZvaWQgd3JpdGVQ
bGFpblRleHQoY29uc3QgU3RyaW5nJik7CiAgICAgdm9pZCB3cml0ZVVSTChjb25zdCBLVVJMJiwg
Y29uc3QgU3RyaW5nJiwgRnJhbWUqID0gMCk7CiAgICAgdm9pZCB3cml0ZUltYWdlKE5vZGUqLCBj
b25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiB0aXRsZSk7Ci0jaWYgUExBVEZPUk0oTUFDKQotICAg
IHZvaWQgd3JpdGVGaWxlV3JhcHBlckFzUlRGREF0dGFjaG1lbnQoTlNGaWxlV3JhcHBlciopOwot
ICAgIFN0cmluZyBhc1VSTChGcmFtZSopOwotI2VuZGlmCiAgICAgdm9pZCB3cml0ZUNsaXBib2Fy
ZChDbGlwYm9hcmQqKTsKICAgICB2b2lkIGNsZWFyKCk7CiAgICAgYm9vbCBjYW5TbWFydFJlcGxh
Y2UoKTsKQEAgLTExNSw5ICsxMTAsNiBAQCBwcml2YXRlOgogCiAjaWYgUExBVEZPUk0oTUFDKQog
ICAgIFJldGFpblB0cjxOU1Bhc3RlYm9hcmQ+IG1fcGFzdGVib2FyZDsKLSAgICBQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGRvY3VtZW50RnJhZ21lbnRXaXRoSW1hZ2VSZXNvdXJjZShGcmFt
ZSogZnJhbWUsIFBhc3NSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiByZXNvdXJjZSk7Ci0gICAgUGFz
c1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBkb2N1bWVudEZyYWdtZW50V2l0aFJ0ZihGcmFtZSog
ZnJhbWUsIE5TU3RyaW5nKiBwYm9hcmRUeXBlKTsKLSAgICBOU1VSTCAqZ2V0QmVzdFVSTChGcmFt
ZSAqKTsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oV0lOKQpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbWFjL0NsaXBib2FyZE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9tYWMvQ2xpcGJvYXJkTWFjLm1tCShyZXZpc2lvbiAxMDYyODkpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvQ2xpcGJvYXJkTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0zNjgsNyArMzY4LDcgQEAgdm9pZCBDbGlwYm9hcmRNYWM6OndyaXRlUmFuZ2UoUmFuZ2UqIHJh
bgogICAgIEFTU0VSVChyYW5nZSk7CiAgICAgQVNTRVJUKGZyYW1lKTsKICAgICBQYXN0ZWJvYXJk
IHBhc3RlYm9hcmQoW21fcGFzdGVib2FyZC5nZXQoKSBuYW1lXSk7Ci0gICAgcGFzdGVib2FyZC53
cml0ZVNlbGVjdGlvbkZvclR5cGVzKG5pbCwgcmFuZ2UsIGZyYW1lLT5lZGl0b3IoKS0+c21hcnRJ
bnNlcnREZWxldGVFbmFibGVkKCkgJiYgZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgp
ID09IFdvcmRHcmFudWxhcml0eSwgZnJhbWUpOworICAgIHBhc3RlYm9hcmQud3JpdGVTZWxlY3Rp
b24ocmFuZ2UsIGZyYW1lLT5lZGl0b3IoKS0+c21hcnRJbnNlcnREZWxldGVFbmFibGVkKCkgJiYg
ZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpID09IFdvcmRHcmFudWxhcml0eSwgZnJh
bWUpOwogfQogCiB2b2lkIENsaXBib2FyZE1hYzo6d3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5n
JiB0ZXh0KQpAQCAtMzgyLDcgKzM4Miw3IEBAIHZvaWQgQ2xpcGJvYXJkTWFjOjp3cml0ZVVSTChj
b25zdCBLVVJMJiAKICAgICBBU1NFUlQoZnJhbWUpOwogICAgIEFTU0VSVChtX3Bhc3RlYm9hcmQp
OwogICAgIFBhc3RlYm9hcmQgcGFzdGVib2FyZChbbV9wYXN0ZWJvYXJkLmdldCgpIG5hbWVdKTsK
LSAgICBwYXN0ZWJvYXJkLndyaXRlVVJMRm9yVHlwZXMobmlsLCB1cmwsIHRpdGxlLCBmcmFtZSk7
CisgICAgcGFzdGVib2FyZC53cml0ZVVSTCh1cmwsIHRpdGxlLCBmcmFtZSk7CiB9CiAgICAgCiAj
aWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21h
Yy9EcmFnRGF0YU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
YWMvRHJhZ0RhdGFNYWMubW0JKHJldmlzaW9uIDEwNjI4OSkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21hYy9EcmFnRGF0YU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsNiArMzEsOSBA
QAogI2ltcG9ydCAiRG9jdW1lbnRGcmFnbWVudC5oIgogI2ltcG9ydCAiRE9NRG9jdW1lbnRGcmFn
bWVudC5oIgogI2ltcG9ydCAiRE9NRG9jdW1lbnRGcmFnbWVudEludGVybmFsLmgiCisjaW1wb3J0
ICJFZGl0b3IuaCIKKyNpbXBvcnQgIkVkaXRvckNsaWVudC5oIgorI2ltcG9ydCAiRnJhbWUuaCIK
ICNpbXBvcnQgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbXBvcnQgIlBhc3RlYm9hcmQuaCIKICNp
bXBvcnQgIlJhbmdlLmgiCkBAIC0xNDcsNyArMTUwLDcgQEAgYm9vbCBEcmFnRGF0YTo6Y29udGFp
bnNVUkwoRnJhbWUqIGZyYW1lLAogewogICAgIHJldHVybiAhYXNVUkwoZnJhbWUsIGZpbGVuYW1l
UG9saWN5KS5pc0VtcHR5KCk7CiB9Ci0gICAgCisKIFN0cmluZyBEcmFnRGF0YTo6YXNVUkwoRnJh
bWUqIGZyYW1lLCBGaWxlbmFtZUNvbnZlcnNpb25Qb2xpY3kgZmlsZW5hbWVQb2xpY3ksIFN0cmlu
ZyogdGl0bGUpIGNvbnN0CiB7CiAgICAgLy8gRklYTUU6IFVzZSBmaWxlbmFtZVBvbGljeS4KQEAg
LTE1Nyw4ICsxNjAsNDEgQEAgU3RyaW5nIERyYWdEYXRhOjphc1VSTChGcmFtZSogZnJhbWUsIEZp
bAogICAgICAgICBpZiAoTlNTdHJpbmcgKlVSTFRpdGxlU3RyaW5nID0gW21fcGFzdGVib2FyZC5n
ZXQoKSBzdHJpbmdGb3JUeXBlOldlYlVSTE5hbWVQYm9hcmRUeXBlXSkKICAgICAgICAgICAgICp0
aXRsZSA9IFVSTFRpdGxlU3RyaW5nOwogICAgIH0KLSAgICBQYXN0ZWJvYXJkIHBhc3RlYm9hcmQo
W21fcGFzdGVib2FyZC5nZXQoKSBuYW1lXSk7Ci0gICAgcmV0dXJuIHBhc3RlYm9hcmQuYXNVUkwo
ZnJhbWUpOworICAgIAorICAgIE5TQXJyYXkgKnR5cGVzID0gW21fcGFzdGVib2FyZC5nZXQoKSB0
eXBlc107CisgICAgCisgICAgLy8gRklYTUU6IHVzaW5nIHRoZSBlZGl0b3JDbGllbnQgdG8gY2Fs
bCBpbnRvIHdlYmtpdCwgZm9yIG5vdywgc2luY2UgCisgICAgLy8gY2FsbGluZyB3ZWJraXRfY2Fu
b25pY2FsaXplIGZyb20gV2ViQ29yZSBpbnZvbHZlcyBtaWdyYXRpbmcgYSBzaXphYmxlIGFtb3Vu
dCBvZiAKKyAgICAvLyBoZWxwZXIgY29kZSB0aGF0IHNob3VsZCBlaXRoZXIgYmUgZG9uZSBpbiBh
IHNlcGFyYXRlIHBhdGNoIG9yIGZpZ3VyZWQgb3V0IGluIGFub3RoZXIgd2F5LgorICAgIAorICAg
IGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNVUkxQYm9hcmRUeXBlXSkgeworICAgICAgICBO
U1VSTCAqVVJMRnJvbVBhc3RlYm9hcmQgPSBbTlNVUkwgVVJMRnJvbVBhc3RlYm9hcmQ6bV9wYXN0
ZWJvYXJkLmdldCgpXTsKKyAgICAgICAgTlNTdHJpbmcgKnNjaGVtZSA9IFtVUkxGcm9tUGFzdGVi
b2FyZCBzY2hlbWVdOworICAgICAgICBpZiAoW3NjaGVtZSBpc0VxdWFsVG9TdHJpbmc6QCJodHRw
Il0gfHwgW3NjaGVtZSBpc0VxdWFsVG9TdHJpbmc6QCJodHRwcyJdKSB7CisgICAgICAgICAgICBy
ZXR1cm4gW2ZyYW1lLT5lZGl0b3IoKS0+Y2xpZW50KCktPmNhbm9uaWNhbGl6ZVVSTChVUkxGcm9t
UGFzdGVib2FyZCkgYWJzb2x1dGVTdHJpbmddOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6TlNTdHJpbmdQYm9hcmRUeXBlXSkgeworICAgICAg
ICBOU1N0cmluZyAqVVJMU3RyaW5nID0gW21fcGFzdGVib2FyZC5nZXQoKSBzdHJpbmdGb3JUeXBl
Ok5TU3RyaW5nUGJvYXJkVHlwZV07CisgICAgICAgIE5TVVJMICpVUkwgPSBmcmFtZS0+ZWRpdG9y
KCktPmNsaWVudCgpLT5jYW5vbmljYWxpemVVUkxTdHJpbmcoVVJMU3RyaW5nKTsKKyAgICAgICAg
aWYgKFVSTCkKKyAgICAgICAgICAgIHJldHVybiBbVVJMIGFic29sdXRlU3RyaW5nXTsKKyAgICB9
CisgICAgCisgICAgaWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU0ZpbGVuYW1lc1Bib2FyZFR5
cGVdKSB7CisgICAgICAgIE5TQXJyYXkgKmZpbGVzID0gW21fcGFzdGVib2FyZC5nZXQoKSBwcm9w
ZXJ0eUxpc3RGb3JUeXBlOk5TRmlsZW5hbWVzUGJvYXJkVHlwZV07CisgICAgICAgIC8vIEZJWE1F
OiBNYXliZSBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGFsbG93IG11bHRpcGxlIGZpbGVzIGFuZCBv
bmx5IHVzZSB0aGUgZmlyc3Qgb25lPworICAgICAgICBpZiAoW2ZpbGVzIGNvdW50XSA9PSAxKSB7
CisgICAgICAgICAgICBOU1N0cmluZyAqZmlsZSA9IFtmaWxlcyBvYmplY3RBdEluZGV4OjBdOwor
ICAgICAgICAgICAgQk9PTCBpc0RpcmVjdG9yeTsKKyAgICAgICAgICAgIGlmIChbW05TRmlsZU1h
bmFnZXIgZGVmYXVsdE1hbmFnZXJdIGZpbGVFeGlzdHNBdFBhdGg6ZmlsZSBpc0RpcmVjdG9yeTom
aXNEaXJlY3RvcnldICYmIGlzRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJp
bmcoKTsKKyAgICAgICAgICAgIHJldHVybiBbZnJhbWUtPmVkaXRvcigpLT5jbGllbnQoKS0+Y2Fu
b25pY2FsaXplVVJMKFtOU1VSTCBmaWxlVVJMV2l0aFBhdGg6ZmlsZV0pIGFic29sdXRlU3RyaW5n
XTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7ICAgICAgICAK
IH0KIAogUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBEcmFnRGF0YTo6YXNGcmFnbWVudChG
cmFtZSogZnJhbWUsIFBhc3NSZWZQdHI8UmFuZ2U+IHJhbmdlLCBib29sIGFsbG93UGxhaW5UZXh0
LCBib29sJiBjaG9zZVBsYWluVGV4dCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21hYy9QYXN0ZWJvYXJkTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21hYy9QYXN0ZWJvYXJkTWFjLm1tCShyZXZpc2lvbiAxMDYyODkpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9tYWMvUGFzdGVib2FyZE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAt
MjEwLDE1ICsyMTAsOSBAQCB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBz
CiAgICAgd3JpdGVTZWxlY3Rpb25Gb3JUeXBlcyhuaWwsIHNlbGVjdGVkUmFuZ2UsIGNhblNtYXJ0
Q29weU9yRGVsZXRlLCBmcmFtZSk7CiB9CiAKLXZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkxGb3JU
eXBlcyhOU0FycmF5KiB0eXBlcywgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxl
U3RyLCBGcmFtZSogZnJhbWUpCitzdGF0aWMgdm9pZCB3cml0ZVVSTEZvclR5cGVzKE5TQXJyYXkq
IHR5cGVzLCBOU1Bhc3RlYm9hcmQqIHBhc3RlYm9hcmQsIGNvbnN0IEtVUkwmIHVybCwgY29uc3Qg
U3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQogewotICAgIGlmICghV2ViQXJjaGl2ZVBi
b2FyZFR5cGUpCi0gICAgICAgIFBhc3RlYm9hcmQ6OmdlbmVyYWxQYXN0ZWJvYXJkKCk7IC8vIElu
aXRpYWxpemVzIHBhc3RlYm9hcmQgdHlwZXMuCi0gICAKLSAgICBpZiAoIXR5cGVzKSB7Ci0gICAg
ICAgIHR5cGVzID0gd3JpdGFibGVUeXBlc0ZvclVSTCgpOwotICAgICAgICBbbV9wYXN0ZWJvYXJk
LmdldCgpIGRlY2xhcmVUeXBlczp0eXBlcyBvd25lcjpuaWxdOwotICAgIH0KKyAgICBbcGFzdGVi
b2FyZCBkZWNsYXJlVHlwZXM6dHlwZXMgb3duZXI6bmlsXTsKICAgICAKICAgICBBU1NFUlQoIXVy
bC5pc0VtcHR5KCkpOwogICAgIApAQCAtMjMzLDIzICsyMjcsMjMgQEAgdm9pZCBQYXN0ZWJvYXJk
Ojp3cml0ZVVSTEZvclR5cGVzKE5TQXJyYQogICAgIH0KICAgICAgICAgCiAgICAgaWYgKFt0eXBl
cyBjb250YWluc09iamVjdDpXZWJVUkxzV2l0aFRpdGxlc1Bib2FyZFR5cGVdKQotICAgICAgICBb
bV9wYXN0ZWJvYXJkLmdldCgpIHNldFByb3BlcnR5TGlzdDpbTlNBcnJheSBhcnJheVdpdGhPYmpl
Y3RzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDp1c2VyVmlzaWJsZVN0cmluZ10sIAorICAgICAg
ICBbcGFzdGVib2FyZCBzZXRQcm9wZXJ0eUxpc3Q6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpb
TlNBcnJheSBhcnJheVdpdGhPYmplY3Q6dXNlclZpc2libGVTdHJpbmddLCAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBbTlNBcnJheSBhcnJheVdpdGhPYmplY3Q6KE5TU3Ry
aW5nKil0aXRsZVN0ci5zdHJpcFdoaXRlU3BhY2UoKV0sIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG5pbF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JUeXBl
OldlYlVSTHNXaXRoVGl0bGVzUGJvYXJkVHlwZV07CiAgICAgaWYgKFt0eXBlcyBjb250YWluc09i
amVjdDpOU1VSTFBib2FyZFR5cGVdKQotICAgICAgICBbY29jb2FVUkwgd3JpdGVUb1Bhc3RlYm9h
cmQ6bV9wYXN0ZWJvYXJkLmdldCgpXTsKKyAgICAgICAgW2NvY29hVVJMIHdyaXRlVG9QYXN0ZWJv
YXJkOnBhc3RlYm9hcmRdOwogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6V2ViVVJMUGJv
YXJkVHlwZV0pCi0gICAgICAgIFttX3Bhc3RlYm9hcmQuZ2V0KCkgc2V0U3RyaW5nOnVzZXJWaXNp
YmxlU3RyaW5nIGZvclR5cGU6V2ViVVJMUGJvYXJkVHlwZV07CisgICAgICAgIFtwYXN0ZWJvYXJk
IHNldFN0cmluZzp1c2VyVmlzaWJsZVN0cmluZyBmb3JUeXBlOldlYlVSTFBib2FyZFR5cGVdOwog
ICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6V2ViVVJMTmFtZVBib2FyZFR5cGVdKQotICAg
ICAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIHNldFN0cmluZzp0aXRsZSBmb3JUeXBlOldlYlVSTE5h
bWVQYm9hcmRUeXBlXTsKKyAgICAgICAgW3Bhc3RlYm9hcmQgc2V0U3RyaW5nOnRpdGxlIGZvclR5
cGU6V2ViVVJMTmFtZVBib2FyZFR5cGVdOwogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6
TlNTdHJpbmdQYm9hcmRUeXBlXSkKLSAgICAgICAgW21fcGFzdGVib2FyZC5nZXQoKSBzZXRTdHJp
bmc6dXNlclZpc2libGVTdHJpbmcgZm9yVHlwZTpOU1N0cmluZ1Bib2FyZFR5cGVdOworICAgICAg
ICBbcGFzdGVib2FyZCBzZXRTdHJpbmc6dXNlclZpc2libGVTdHJpbmcgZm9yVHlwZTpOU1N0cmlu
Z1Bib2FyZFR5cGVdOwogfQogICAgIAogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVSTChjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFtZSkKIHsKLSAgICB3
cml0ZVVSTEZvclR5cGVzKG5pbCwgdXJsLCB0aXRsZVN0ciwgZnJhbWUpOworICAgIHdyaXRlVVJM
Rm9yVHlwZXMod3JpdGFibGVUeXBlc0ZvclVSTCgpLCBtX3Bhc3RlYm9hcmQuZ2V0KCksIHVybCwg
dGl0bGVTdHIsIGZyYW1lKTsKIH0KIAogc3RhdGljIE5TRmlsZVdyYXBwZXIqIGZpbGVXcmFwcGVy
Rm9ySW1hZ2UoQ2FjaGVkUmVzb3VyY2UqIHJlc291cmNlLCBOU1VSTCAqdXJsKQpAQCAtMjY1LDcg
KzI1OSw3IEBAIHN0YXRpYyBOU0ZpbGVXcmFwcGVyKiBmaWxlV3JhcHBlckZvckltYWcKICAgICBy
ZXR1cm4gd3JhcHBlcjsKIH0KIAotdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUZpbGVXcmFwcGVyQXNS
VEZEQXR0YWNobWVudChOU0ZpbGVXcmFwcGVyKiB3cmFwcGVyKQorc3RhdGljIHZvaWQgd3JpdGVG
aWxlV3JhcHBlckFzUlRGREF0dGFjaG1lbnQoTlNGaWxlV3JhcHBlciogd3JhcHBlciwgTlNQYXN0
ZWJvYXJkKiBwYXN0ZWJvYXJkKQogewogICAgIE5TVGV4dEF0dGFjaG1lbnQgKmF0dGFjaG1lbnQg
PSBbW05TVGV4dEF0dGFjaG1lbnQgYWxsb2NdIGluaXRXaXRoRmlsZVdyYXBwZXI6d3JhcHBlcl07
CiAgICAgCkBAIC0yNzMsNyArMjY3LDcgQEAgdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUZpbGVXcmFw
cGVyQXNSVEZEQQogICAgIFthdHRhY2htZW50IHJlbGVhc2VdOwogICAgIAogICAgIE5TRGF0YSAq
UlRGRERhdGEgPSBbc3RyaW5nIFJURkRGcm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3N0cmluZyBs
ZW5ndGhdKSBkb2N1bWVudEF0dHJpYnV0ZXM6bmlsXTsKLSAgICBbbV9wYXN0ZWJvYXJkLmdldCgp
IHNldERhdGE6UlRGRERhdGEgZm9yVHlwZTpOU1JURkRQYm9hcmRUeXBlXTsKKyAgICBbcGFzdGVi
b2FyZCBzZXREYXRhOlJURkREYXRhIGZvclR5cGU6TlNSVEZEUGJvYXJkVHlwZV07CiB9CiAKIHZv
aWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShOb2RlKiBub2RlLCBjb25zdCBLVVJMJiB1cmwsIGNv
bnN0IFN0cmluZyYgdGl0bGUpCkBAIC0yOTMsOSArMjg3LDcgQEAgdm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZUltYWdlKE5vZGUqIG5vZGUsIAogICAgIGlmICghY2FjaGVkSW1hZ2UgfHwgY2FjaGVkSW1h
Z2UtPmVycm9yT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgTlNBcnJheSogdHlw
ZXMgPSB3cml0YWJsZVR5cGVzRm9ySW1hZ2UoKTsKLSAgICBbbV9wYXN0ZWJvYXJkLmdldCgpIGRl
Y2xhcmVUeXBlczp0eXBlcyBvd25lcjpuaWxdOwotICAgIHdyaXRlVVJMRm9yVHlwZXModHlwZXMs
IGNvY29hVVJMLCBuc1N0cmluZ05pbElmRW1wdHkodGl0bGUpLCBmcmFtZSk7CisgICAgd3JpdGVV
UkxGb3JUeXBlcyh3cml0YWJsZVR5cGVzRm9ySW1hZ2UoKSwgbV9wYXN0ZWJvYXJkLmdldCgpLCBj
b2NvYVVSTCwgbnNTdHJpbmdOaWxJZkVtcHR5KHRpdGxlKSwgZnJhbWUpOwogICAgIAogICAgIElt
YWdlKiBpbWFnZSA9IGNhY2hlZEltYWdlLT5pbWFnZUZvclJlbmRlcmVyKHJlbmRlcmVyKTsKICAg
ICBBU1NFUlQoaW1hZ2UpOwpAQCAtMzA1LDcgKzI5Nyw3IEBAIHZvaWQgUGFzdGVib2FyZDo6d3Jp
dGVJbWFnZShOb2RlKiBub2RlLCAKICAgICBTdHJpbmcgTUlNRVR5cGUgPSBjYWNoZWRJbWFnZS0+
cmVzcG9uc2UoKS5taW1lVHlwZSgpOwogICAgIEFTU0VSVChNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1
cHBvcnRlZEltYWdlUmVzb3VyY2VNSU1FVHlwZShNSU1FVHlwZSkpOwogCi0gICAgd3JpdGVGaWxl
V3JhcHBlckFzUlRGREF0dGFjaG1lbnQoZmlsZVdyYXBwZXJGb3JJbWFnZShjYWNoZWRJbWFnZSwg
Y29jb2FVUkwpKTsKKyAgICB3cml0ZUZpbGVXcmFwcGVyQXNSVEZEQXR0YWNobWVudChmaWxlV3Jh
cHBlckZvckltYWdlKGNhY2hlZEltYWdlLCBjb2NvYVVSTCksIG1fcGFzdGVib2FyZC5nZXQoKSk7
CiB9CiAKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVDbGlwYm9hcmQoQ2xpcGJvYXJkKiBjbGlwYm9h
cmQpCkBAIC0zNjUsNyArMzU3LDcgQEAgU3RyaW5nIFBhc3RlYm9hcmQ6OnBsYWluVGV4dChGcmFt
ZSogZnJhbQogICAgIHJldHVybiBTdHJpbmcoKTsgCiB9CiAgICAgCi1QYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnRXaXRoSW1hZ2VSZXNvdXJj
ZShGcmFtZSogZnJhbWUsIFBhc3NSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiByZXNvdXJjZSkKK3N0
YXRpYyBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGRvY3VtZW50RnJhZ21lbnRXaXRoSW1h
Z2VSZXNvdXJjZShGcmFtZSogZnJhbWUsIFBhc3NSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiByZXNv
dXJjZSkKIHsKICAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGxvYWRlciA9IGZyYW1lLT5sb2FkZXIo
KS0+ZG9jdW1lbnRMb2FkZXIoKSkKICAgICAgICAgbG9hZGVyLT5hZGRBcmNoaXZlUmVzb3VyY2Uo
cmVzb3VyY2UuZ2V0KCkpOwpAQCAtMzg1LDE2ICszNzcsMTYgQEAgUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBQYXN0ZWJvYXJkOgogICAgIHJldHVybiAwOwogfQogCi1QYXNzUmVmUHRyPERv
Y3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnRXaXRoUnRmKEZyYW1l
KiBmcmFtZSwgTlNTdHJpbmcqIHBib2FyZFR5cGUpCitzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBkb2N1bWVudEZyYWdtZW50V2l0aFJ0ZihGcmFtZSogZnJhbWUsIE5TU3RyaW5n
KiBwYm9hcmRUeXBlLCBOU1Bhc3RlYm9hcmQqIHBhc3RlYm9hcmQpCiB7CiAgICAgaWYgKCFmcmFt
ZSB8fCAhZnJhbWUtPmRvY3VtZW50KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIE5TQXR0cmlidXRlZFN0cmluZyAqc3Ry
aW5nID0gbmlsOwogICAgIGlmIChwYm9hcmRUeXBlID09IE5TUlRGRFBib2FyZFR5cGUpCi0gICAg
ICAgIHN0cmluZyA9IFtbTlNBdHRyaWJ1dGVkU3RyaW5nIGFsbG9jXSBpbml0V2l0aFJURkQ6W21f
cGFzdGVib2FyZC5nZXQoKSBkYXRhRm9yVHlwZTpOU1JURkRQYm9hcmRUeXBlXSBkb2N1bWVudEF0
dHJpYnV0ZXM6TlVMTF07CisgICAgICAgIHN0cmluZyA9IFtbTlNBdHRyaWJ1dGVkU3RyaW5nIGFs
bG9jXSBpbml0V2l0aFJURkQ6W3Bhc3RlYm9hcmQgZGF0YUZvclR5cGU6TlNSVEZEUGJvYXJkVHlw
ZV0gZG9jdW1lbnRBdHRyaWJ1dGVzOk5VTExdOwogICAgIGlmIChzdHJpbmcgPT0gbmlsKQotICAg
ICAgICBzdHJpbmcgPSBbW05TQXR0cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhSVEY6W21f
cGFzdGVib2FyZC5nZXQoKSBkYXRhRm9yVHlwZTpOU1JURlBib2FyZFR5cGVdIGRvY3VtZW50QXR0
cmlidXRlczpOVUxMXTsKKyAgICAgICAgc3RyaW5nID0gW1tOU0F0dHJpYnV0ZWRTdHJpbmcgYWxs
b2NdIGluaXRXaXRoUlRGOltwYXN0ZWJvYXJkIGRhdGFGb3JUeXBlOk5TUlRGUGJvYXJkVHlwZV0g
ZG9jdW1lbnRBdHRyaWJ1dGVzOk5VTExdOwogICAgIGlmIChzdHJpbmcgPT0gbmlsKQogICAgICAg
ICByZXR1cm4gbmlsOwogCkBAIC00MzIsNDkgKzQyNCw2IEBAIHN0YXRpYyBOU1VSTCogdW5pcXVl
VVJMV2l0aFJlbGF0aXZlUGFydCgKICAgICByZXR1cm4gVVJMOwogfQogCi1OU1VSTCAqUGFzdGVi
b2FyZDo6Z2V0QmVzdFVSTChGcmFtZSogZnJhbWUpCi17Ci0gICAgTlNBcnJheSAqdHlwZXMgPSBb
bV9wYXN0ZWJvYXJkLmdldCgpIHR5cGVzXTsKLQotICAgIC8vIEZJWE1FOiB1c2luZyB0aGUgZWRp
dG9yQ2xpZW50IHRvIGNhbGwgaW50byB3ZWJraXQsIGZvciBub3csIHNpbmNlIAotICAgIC8vIGNh
bGxpbmcgd2Via2l0X2Nhbm9uaWNhbGl6ZSBmcm9tIFdlYkNvcmUgaW52b2x2ZXMgbWlncmF0aW5n
IGEgc2l6YWJsZSBhbW91bnQgb2YgCi0gICAgLy8gaGVscGVyIGNvZGUgdGhhdCBzaG91bGQgZWl0
aGVyIGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXRjaCBvciBmaWd1cmVkIG91dCBpbiBhbm90aGVy
IHdheS4KLSAgICAKLSAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TVVJMUGJvYXJkVHlw
ZV0pIHsKLSAgICAgICAgTlNVUkwgKlVSTEZyb21QYXN0ZWJvYXJkID0gW05TVVJMIFVSTEZyb21Q
YXN0ZWJvYXJkOm1fcGFzdGVib2FyZC5nZXQoKV07Ci0gICAgICAgIE5TU3RyaW5nICpzY2hlbWUg
PSBbVVJMRnJvbVBhc3RlYm9hcmQgc2NoZW1lXTsKLSAgICAgICAgaWYgKFtzY2hlbWUgaXNFcXVh
bFRvU3RyaW5nOkAiaHR0cCJdIHx8IFtzY2hlbWUgaXNFcXVhbFRvU3RyaW5nOkAiaHR0cHMiXSkg
ewotICAgICAgICAgICAgcmV0dXJuIGZyYW1lLT5lZGl0b3IoKS0+Y2xpZW50KCktPmNhbm9uaWNh
bGl6ZVVSTChVUkxGcm9tUGFzdGVib2FyZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAg
aWYgKFt0eXBlcyBjb250YWluc09iamVjdDpOU1N0cmluZ1Bib2FyZFR5cGVdKSB7Ci0gICAgICAg
IE5TU3RyaW5nICpVUkxTdHJpbmcgPSBbbV9wYXN0ZWJvYXJkLmdldCgpIHN0cmluZ0ZvclR5cGU6
TlNTdHJpbmdQYm9hcmRUeXBlXTsKLSAgICAgICAgTlNVUkwgKlVSTCA9IGZyYW1lLT5lZGl0b3Io
KS0+Y2xpZW50KCktPmNhbm9uaWNhbGl6ZVVSTFN0cmluZyhVUkxTdHJpbmcpOwotICAgICAgICBp
ZiAoVVJMKQotICAgICAgICAgICAgcmV0dXJuIFVSTDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKFt0
eXBlcyBjb250YWluc09iamVjdDpOU0ZpbGVuYW1lc1Bib2FyZFR5cGVdKSB7Ci0gICAgICAgIE5T
QXJyYXkgKmZpbGVzID0gW21fcGFzdGVib2FyZC5nZXQoKSBwcm9wZXJ0eUxpc3RGb3JUeXBlOk5T
RmlsZW5hbWVzUGJvYXJkVHlwZV07Ci0gICAgICAgIC8vIEZJWE1FOiBNYXliZSBpdCBtYWtlcyBt
b3JlIHNlbnNlIHRvIGFsbG93IG11bHRpcGxlIGZpbGVzIGFuZCBvbmx5IHVzZSB0aGUgZmlyc3Qg
b25lPwotICAgICAgICBpZiAoW2ZpbGVzIGNvdW50XSA9PSAxKSB7Ci0gICAgICAgICAgICBOU1N0
cmluZyAqZmlsZSA9IFtmaWxlcyBvYmplY3RBdEluZGV4OjBdOwotICAgICAgICAgICAgQk9PTCBp
c0RpcmVjdG9yeTsKLSAgICAgICAgICAgIGlmIChbW05TRmlsZU1hbmFnZXIgZGVmYXVsdE1hbmFn
ZXJdIGZpbGVFeGlzdHNBdFBhdGg6ZmlsZSBpc0RpcmVjdG9yeTomaXNEaXJlY3RvcnldICYmIGlz
RGlyZWN0b3J5KQotICAgICAgICAgICAgICAgIHJldHVybiBuaWw7Ci0gICAgICAgICAgICByZXR1
cm4gZnJhbWUtPmVkaXRvcigpLT5jbGllbnQoKS0+Y2Fub25pY2FsaXplVVJMKFtOU1VSTCBmaWxl
VVJMV2l0aFBhdGg6ZmlsZV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBu
aWw7ICAgIAotfQotCi1TdHJpbmcgUGFzdGVib2FyZDo6YXNVUkwoRnJhbWUqIGZyYW1lKQotewot
ICAgIHJldHVybiBbZ2V0QmVzdFVSTChmcmFtZSkgYWJzb2x1dGVTdHJpbmddOwotfQotCiBQYXNz
UmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnQoRnJh
bWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93UGxhaW5UZXh0
LCBib29sJiBjaG9zZVBsYWluVGV4dCkKIHsKICAgICBOU0FycmF5ICp0eXBlcyA9IFttX3Bhc3Rl
Ym9hcmQuZ2V0KCkgdHlwZXNdOwpAQCAtNTQwLDExICs0ODksMTEgQEAgUGFzc1JlZlB0cjxEb2N1
bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJkOgogICAgIH0KIAogICAgIGlmIChbdHlwZXMgY29udGFp
bnNPYmplY3Q6TlNSVEZEUGJvYXJkVHlwZV0gJiYKLSAgICAgICAgKGZyYWdtZW50ID0gZG9jdW1l
bnRGcmFnbWVudFdpdGhSdGYoZnJhbWUsIE5TUlRGRFBib2FyZFR5cGUpKSkKKyAgICAgICAgKGZy
YWdtZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhSdGYoZnJhbWUsIE5TUlRGRFBib2FyZFR5cGUs
IG1fcGFzdGVib2FyZC5nZXQoKSkpKQogICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7
CiAKICAgICBpZiAoW3R5cGVzIGNvbnRhaW5zT2JqZWN0Ok5TUlRGUGJvYXJkVHlwZV0gJiYKLSAg
ICAgICAgKGZyYWdtZW50ID0gZG9jdW1lbnRGcmFnbWVudFdpdGhSdGYoZnJhbWUsIE5TUlRGUGJv
YXJkVHlwZSkpKQorICAgICAgICAoZnJhZ21lbnQgPSBkb2N1bWVudEZyYWdtZW50V2l0aFJ0Zihm
cmFtZSwgTlNSVEZQYm9hcmRUeXBlLCBtX3Bhc3RlYm9hcmQuZ2V0KCkpKSkKICAgICAgICAgcmV0
dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKIAogICAgIGlmIChbdHlwZXMgY29udGFpbnNPYmplY3Q6
TlNUSUZGUGJvYXJkVHlwZV0gJiYK
</data>
<flag name="review"
          id="126637"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>