<?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>138034</bug_id>
          
          <creation_ts>2014-10-23 18:12:41 -0700</creation_ts>
          <short_desc>[Mac][WebKit2] Move action menu code into its own file</short_desc>
          <delta_ts>2014-10-24 16:06:12 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Tim Horton">thorton</reporter>
          <assigned_to name="Tim Horton">thorton</assigned_to>
          <cc>andersca</cc>
    
    <cc>bdakin</cc>
    
    <cc>beidson</cc>
    
    <cc>commit-queue</cc>
    
    <cc>conrad_shultz</cc>
    
    <cc>mitz</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1043900</commentid>
    <comment_count>0</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-23 18:12:41 -0700</bug_when>
    <thetext>[Mac][WebKit2] Move action menu code into its own file</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1043901</commentid>
    <comment_count>1</comment_count>
      <attachid>240382</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-23 18:13:09 -0700</bug_when>
    <thetext>Created attachment 240382
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1043902</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2014-10-23 18:13:56 -0700</bug_when>
    <thetext>&lt;rdar://problem/18758758&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1043903</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-10-23 18:15:46 -0700</bug_when>
    <thetext>Attachment 240382 did not pass style-queue:


ERROR: Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:225:  The parameter type should use PassRefPtr instead of RefPtr.  [readability/pass_ptr] [5]
Total errors found: 1 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1043927</commentid>
    <comment_count>4</comment_count>
      <attachid>240382</attachid>
    <who name="">mitz</who>
    <bug_when>2014-10-23 21:00:42 -0700</bug_when>
    <thetext>Comment on attachment 240382
Patch

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

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:61
&gt; +using namespace WebCore;
&gt; +using namespace WebKit;

I thought using namespace {WebCore, WebKit} had fallen out of favor lately.

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:71
&gt; +@interface WKActionMenuController (Internal)
&gt; +- (void)_updateActionMenuItems;
&gt; +@end

Why does this need to be in a category?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:75
&gt; +    WebPageProxy *_page;
&gt; +    WKView *_wkView;

How do we ensure that we don’t access these ivars beyond these objects’ lifetimes?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:94
&gt; +    _wkView.actionMenu = _menu.get();

It’s a little strange for the initializer to mutate the view like this.

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:106
&gt; +    _page-&gt;performActionMenuHitTestAtLocation([_wkView convertPoint:[event locationInWindow] fromView:nil]);

event.locationInWindow

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:148
&gt; +@end
&gt; +
&gt; +@implementation WKActionMenuController (Internal)

Why is this category needed?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:155
&gt; +    if (!hitTestResult)

Why do we check this if our only caller already does?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:166
&gt; +    return @[openLinkItem.get(), previewLinkItem.get(), [NSMenuItem separatorItem], readingListItem.get()];

Please add spaces after @[ and before ].

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:176
&gt; +    NSURL *url = [NSURL URLWithString:hitTestResult-&gt;absoluteLinkURL()];
&gt; +    [[NSWorkspace sharedWorkspace] openURL:url];

Can you use -_web_URLWithWTFString: instead of URLWithString: here? No need for the local url variable.

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:187
&gt; +    NSURL *url = [NSURL URLWithString:hitTestResult-&gt;absoluteLinkURL()];
&gt; +    NSSharingService *service = [NSSharingService sharingServiceNamed:NSSharingServiceNameAddToSafariReadingList];
&gt; +    [service performWithItems:@[ url ]];

Can you use -_web_URLWithWTFString:? No need for so many local variables here.

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:209
&gt; +    [bubble showPreviewItem:[NSURL URLWithString:hitTestResult-&gt;absoluteLinkURL()] itemFrame:itemFrame];

Can you use -_web_URLWithWTFString: here?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:217
&gt; +    if (!hitTestResult)

Why do we check this if our only caller already does?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:232
&gt; +    return @[copyImageItem.get(), addToPhotosItem.get(), saveToDownloadsItem.get(), shareItem.get()];

Please add spaces after @[ and before ].

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:257
&gt; +    _page-&gt;process().context().download(_page, URL(URL(), hitTestResult-&gt;absoluteImageURL()));

We can’t trust absoluteImageURL() to be already-parsed?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:302
&gt; +static NSString *temporaryPhotosDirectoryPath()
&gt; +{
&gt; +    static NSString *temporaryPhotosDirectoryPath;
&gt; +
&gt; +    if (!temporaryPhotosDirectoryPath) {
&gt; +        NSString *temporaryDirectoryTemplate = [NSTemporaryDirectory() stringByAppendingPathComponent:@&quot;WebKitPhotos-XXXXXX&quot;];
&gt; +        CString templateRepresentation = [temporaryDirectoryTemplate fileSystemRepresentation];
&gt; +
&gt; +        if (mkdtemp(templateRepresentation.mutableData()))
&gt; +            temporaryPhotosDirectoryPath = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:templateRepresentation.data() length:templateRepresentation.length()] copy];
&gt; +    }
&gt; +
&gt; +    return temporaryPhotosDirectoryPath;
&gt; +}
&gt; +
&gt; +static NSString *pathToPhotoOnDisk(NSString *suggestedFilename)
&gt; +{
&gt; +    NSString *photoDirectoryPath = temporaryPhotosDirectoryPath();
&gt; +    if (!photoDirectoryPath) {
&gt; +        WTFLogAlways(&quot;Cannot create temporary photo download directory.&quot;);
&gt; +        return nil;
&gt; +    }
&gt; +
&gt; +    NSString *path = [photoDirectoryPath stringByAppendingPathComponent:suggestedFilename];
&gt; +
&gt; +    NSFileManager *fileManager = [NSFileManager defaultManager];
&gt; +    if ([fileManager fileExistsAtPath:path]) {
&gt; +        NSString *pathTemplatePrefix = [photoDirectoryPath stringByAppendingPathComponent:@&quot;XXXXXX-&quot;];
&gt; +        NSString *pathTemplate = [pathTemplatePrefix stringByAppendingString:suggestedFilename];
&gt; +        CString pathTemplateRepresentation = [pathTemplate fileSystemRepresentation];
&gt; +
&gt; +        int fd = mkstemps(pathTemplateRepresentation.mutableData(), pathTemplateRepresentation.length() - strlen([pathTemplatePrefix fileSystemRepresentation]) + 1);
&gt; +        if (fd &lt; 0) {
&gt; +            WTFLogAlways(&quot;Cannot create photo file in the temporary directory (%@).&quot;, suggestedFilename);
&gt; +            return nil;
&gt; +        }
&gt; +
&gt; +        close(fd);
&gt; +        path = [fileManager stringWithFileSystemRepresentation:pathTemplateRepresentation.data() length:pathTemplateRepresentation.length()];
&gt; +    }
&gt; +
&gt; +    return path;
&gt; +}

This is almost identical to PDF-related functions in WebPageProxyMac.mm. You should refactor and reuse that code.

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:306
&gt; +    // FIXME: We shouldn&apos;t even add the button if this is the case, for now.

s/button/menu item/

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:307
&gt; +    if (![getIKSlideshowClass() canExportToApplication:(@&quot;com.apple.Photos&quot;)])

Why the parentheses around the NSString literal?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:333
&gt; +            [getIKSlideshowClass() exportSlideshowItem:filePath toApplication:(@&quot;com.apple.Photos&quot;)];

Why the parentheses around the NSString literal?

&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:342
&gt; +    SEL selector = nil;

SEL isn’t an id, so you should use 0 here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1043928</commentid>
    <comment_count>5</comment_count>
      <attachid>240382</attachid>
    <who name="">mitz</who>
    <bug_when>2014-10-23 21:02:53 -0700</bug_when>
    <thetext>Comment on attachment 240382
Patch

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

&gt;&gt; Source/WebKit2/UIProcess/mac/WKActionMenuController.mm:342
&gt;&gt; +    SEL selector = nil;
&gt; 
&gt; SEL isn’t an id, so you should use 0 here.

Or nullptr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1044060</commentid>
    <comment_count>6</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-24 14:13:57 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/175178 and http://trac.webkit.org/changeset/175179</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1044073</commentid>
    <comment_count>7</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-24 14:40:44 -0700</bug_when>
    <thetext>And https://trac.webkit.org/changeset/175180</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1044074</commentid>
    <comment_count>8</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-24 14:46:46 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/175181</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1044077</commentid>
    <comment_count>9</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-24 14:52:10 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/175184</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1044079</commentid>
    <comment_count>10</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-10-24 15:01:20 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/175185</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>240382</attachid>
            <date>2014-10-23 18:13:09 -0700</date>
            <delta_ts>2014-10-23 21:00:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-138034-20141023181316.patch</filename>
            <type>text/plain</type>
            <size>43304</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc1MTQ3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggODg4ZDFjNjhmNzhmYjU4
ZmY4YmVmYzMyNDZmMTYzNWZlZmJiODMxYy4uYTRmZmU4OTliZWZjNzk2MDYwYmE0Zjc4ZWYzNTIy
OGJjNjI5N2NlNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDYyIEBACiAyMDE0LTEwLTIzICBUaW0g
SG9ydG9uICA8dGltb3RoeV9ob3J0b25AYXBwbGUuY29tPgogCisgICAgICAgIFtNYWNdW1dlYktp
dDJdIE1vdmUgYWN0aW9uIG1lbnUgY29kZSBpbnRvIGl0cyBvd24gZmlsZQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDM0CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL21hYy9X
S1ZpZXcubW06CisgICAgICAgICgtW1dLVmlldyBpbml0V2l0aEZyYW1lOmNvbnRleHQ6Y29uZmln
dXJhdGlvbjp3ZWJWaWV3Ol0pOgorICAgICAgICBNYWtlIGEgV0tBY3Rpb25NZW51Q29udHJvbGxl
ciBpZiBuZWVkZWQuCisKKyAgICAgICAgKC1bV0tWaWV3IHByZXBhcmVGb3JNZW51OndpdGhFdmVu
dDpdKToKKyAgICAgICAgKC1bV0tWaWV3IHdpbGxPcGVuTWVudTp3aXRoRXZlbnQ6XSk6CisgICAg
ICAgICgtW1dLVmlldyBkaWRDbG9zZU1lbnU6d2l0aEV2ZW50Ol0pOgorICAgICAgICAoLVtXS1Zp
ZXcgX2RpZFBlcmZvcm1BY3Rpb25NZW51SGl0VGVzdDpdKToKKyAgICAgICAgRm9yd2FyZCB0aGVz
ZSB0byBXS0FjdGlvbk1lbnVDb250cm9sbGVyLgorCisgICAgICAgICgtW1dLVmlldyBfb3BlblVS
TEZyb21BY3Rpb25NZW51Ol0pOiBEZWxldGVkLgorICAgICAgICAoLVtXS1ZpZXcgX2FkZFRvUmVh
ZGluZ0xpc3RGcm9tQWN0aW9uTWVudTpdKTogRGVsZXRlZC4KKyAgICAgICAgKC1bV0tWaWV3IF9x
dWlja0xvb2tVUkxGcm9tQWN0aW9uTWVudTpdKTogRGVsZXRlZC4KKyAgICAgICAgKC1bV0tWaWV3
IF9jcmVhdGVBY3Rpb25NZW51SXRlbUZvclRhZzpdKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYktp
dEJ1bmRsZUltYWdlTmFtZWQpOiBEZWxldGVkLgorICAgICAgICAoLVtXS1ZpZXcgX2NvcHlJbWFn
ZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKC1bV0tWaWV3IF9zYXZlSW1hZ2VUb0Rvd25sb2Fkczpd
KTogRGVsZXRlZC4KKyAgICAgICAgKHRlbXBvcmFyeVBob3Rvc0RpcmVjdG9yeVBhdGgpOiBEZWxl
dGVkLgorICAgICAgICAocGF0aFRvUGhvdG9PbkRpc2spOiBEZWxldGVkLgorICAgICAgICAoLVtX
S1ZpZXcgX2FkZEltYWdlVG9QaG90b3M6XSk6IERlbGV0ZWQuCisgICAgICAgICgtW1dLVmlldyBf
ZGVmYXVsdE1lbnVJdGVtc0ZvckltYWdlXSk6IERlbGV0ZWQuCisgICAgICAgICgtW1dLVmlldyBf
ZGVmYXVsdE1lbnVJdGVtc10pOiBEZWxldGVkLgorICAgICAgICAoLVtXS1ZpZXcgX3VwZGF0ZUFj
dGlvbk1lbnVdKTogRGVsZXRlZC4KKyAgICAgICAgTW92ZWQgdG8gV0tBY3Rpb25NZW51Q29udHJv
bGxlci4KKworICAgICAgICAqIFVJUHJvY2Vzcy9tYWMvV0tBY3Rpb25NZW51Q29udHJvbGxlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvbWFjL1dLQWN0aW9uTWVudUNvbnRyb2xsZXIu
bW06IEFkZGVkLgorICAgICAgICAoLVtXS0FjdGlvbk1lbnVDb250cm9sbGVyIGluaXRXaXRoUGFn
ZTp2aWV3Ol0pOgorICAgICAgICAoLVtXS0FjdGlvbk1lbnVDb250cm9sbGVyIHByZXBhcmVGb3JN
ZW51OndpdGhFdmVudDpdKToKKyAgICAgICAgKC1bV0tBY3Rpb25NZW51Q29udHJvbGxlciB3aWxs
T3Blbk1lbnU6d2l0aEV2ZW50Ol0pOgorICAgICAgICAoLVtXS0FjdGlvbk1lbnVDb250cm9sbGVy
IGRpZENsb3NlTWVudTp3aXRoRXZlbnQ6XSk6CisgICAgICAgICgtW1dLQWN0aW9uTWVudUNvbnRy
b2xsZXIgZGlkUGVyZm9ybUFjdGlvbk1lbnVIaXRUZXN0Ol0pOgorICAgICAgICAoLVtXS0FjdGlv
bk1lbnVDb250cm9sbGVyIF9kZWZhdWx0TWVudUl0ZW1zRm9yTGlua10pOgorICAgICAgICAoLVtX
S0FjdGlvbk1lbnVDb250cm9sbGVyIF9vcGVuVVJMRnJvbUFjdGlvbk1lbnU6XSk6CisgICAgICAg
ICgtW1dLQWN0aW9uTWVudUNvbnRyb2xsZXIgX2FkZFRvUmVhZGluZ0xpc3RGcm9tQWN0aW9uTWVu
dTpdKToKKyAgICAgICAgKC1bV0tBY3Rpb25NZW51Q29udHJvbGxlciBfcXVpY2tMb29rVVJMRnJv
bUFjdGlvbk1lbnU6XSk6CisgICAgICAgICgtW1dLQWN0aW9uTWVudUNvbnRyb2xsZXIgX2RlZmF1
bHRNZW51SXRlbXNGb3JJbWFnZV0pOgorICAgICAgICAoLVtXS0FjdGlvbk1lbnVDb250cm9sbGVy
IF9jb3B5SW1hZ2U6XSk6CisgICAgICAgICgtW1dLQWN0aW9uTWVudUNvbnRyb2xsZXIgX3NhdmVJ
bWFnZVRvRG93bmxvYWRzOl0pOgorICAgICAgICAodGVtcG9yYXJ5UGhvdG9zRGlyZWN0b3J5UGF0
aCk6CisgICAgICAgIChwYXRoVG9QaG90b09uRGlzayk6CisgICAgICAgICgtW1dLQWN0aW9uTWVu
dUNvbnRyb2xsZXIgX2FkZEltYWdlVG9QaG90b3M6XSk6CisgICAgICAgICgtW1dLQWN0aW9uTWVu
dUNvbnRyb2xsZXIgX2NyZWF0ZUFjdGlvbk1lbnVJdGVtRm9yVGFnOl0pOgorICAgICAgICAod2Vi
S2l0QnVuZGxlSW1hZ2VOYW1lZCk6CisgICAgICAgIChpbWFnZUZvclJlc291cmNlOm5hbWU6Omlm
KToKKyAgICAgICAgKC1bV0tBY3Rpb25NZW51Q29udHJvbGxlciBfdXBkYXRlQWN0aW9uTWVudUl0
ZW1zXSk6CisgICAgICAgIE1vdmVkIGZyb20gV0tWaWV3LgorCisgICAgICAgICogV2ViS2l0Mi54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorCisyMDE0LTEwLTIzICBUaW0gSG9ydG9uICA8dGlt
b3RoeV9ob3J0b25AYXBwbGUuY29tPgorCiAgICAgICAgIEFkZCBzb21lIFNQSSBoZWFkZXJzIGZv
ciBOU0V4dGVuc2lvbiBhbmQgTlNTaGFyaW5nU2VydmljZXtQaWNrZXJ9CiAgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzgwMjcKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tIGIvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCmluZGV4IDE0MWEzMWM0M2NjNTZhNDQ0YjZk
ZjhjNjBmNWZhOGZkNmU5MDI1MWIuLjgwYjhhMjdiN2Y4MjE1NjA5ZWNmOTUwNmU5ZTI1MGY0Zjg3
YjBiMjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmll
dy5tbQorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXcubW0KQEAg
LTU3LDYgKzU3LDcgQEAKICNpbXBvcnQgIlZpZXdHZXN0dXJlQ29udHJvbGxlci5oIgogI2ltcG9y
dCAiVmlld1NuYXBzaG90U3RvcmUuaCIKICNpbXBvcnQgIldLQVBJQ2FzdC5oIgorI2ltcG9ydCAi
V0tBY3Rpb25NZW51Q29udHJvbGxlci5oIgogI2ltcG9ydCAiV0tBY3Rpb25NZW51SXRlbVR5cGVz
LmgiCiAjaW1wb3J0ICJXS0Z1bGxTY3JlZW5XaW5kb3dDb250cm9sbGVyLmgiCiAjaW1wb3J0ICJX
S1ByaW50aW5nVmlldy5oIgpAQCAtNzYsOCArNzcsNiBAQAogI2ltcG9ydCAiV2ViUHJvY2Vzc1By
b3h5LmgiCiAjaW1wb3J0ICJXZWJTeXN0ZW1JbnRlcmZhY2UuaCIKICNpbXBvcnQgIl9XS1RodW1i
bmFpbFZpZXdJbnRlcm5hbC5oIgotI2ltcG9ydCA8SW1hZ2VJTy9JbWFnZUlPLmg+Ci0jaW1wb3J0
IDxJbWFnZUtpdC9JbWFnZUtpdC5oPgogI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+
CiAjaW1wb3J0IDxXZWJDb3JlL0FYT2JqZWN0Q2FjaGUuaD4KICNpbXBvcnQgPFdlYkNvcmUvQ29s
b3JNYWMuaD4KQEAgLTg5LDcgKzg4LDYgQEAKICNpbXBvcnQgPFdlYkNvcmUvRmlsZVN5c3RlbS5o
PgogI2ltcG9ydCA8V2ViQ29yZS9LZXlib2FyZEV2ZW50Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL0xv
Y2FsaXplZFN0cmluZ3MuaD4KLSNpbXBvcnQgPFdlYkNvcmUvTlNTaGFyaW5nU2VydmljZVBpY2tl
clNQSS5oPgogI2ltcG9ydCA8V2ViQ29yZS9OU1ZpZXdTUEkuaD4KICNpbXBvcnQgPFdlYkNvcmUv
UGxhdGZvcm1FdmVudEZhY3RvcnlNYWMuaD4KICNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1TY3Jl
ZW4uaD4KQEAgLTEyNCwxNiArMTIyLDYgQEAKIC0gKHZvaWQpX21hc2tSb3VuZGVkQm90dG9tQ29y
bmVyczooTlNSZWN0KWNsaXBSZWN0OwogQGVuZAogCi1AY2xhc3MgUUxQcmV2aWV3QnViYmxlOwot
QGludGVyZmFjZSBOU09iamVjdCAoV0tRTFByZXZpZXdCdWJibGVEZXRhaWxzKQotQHByb3BlcnR5
IChjb3B5KSBOU0FycmF5ICogY29udHJvbHM7Ci1AcHJvcGVydHkgTlNTaXplIG1heGltdW1TaXpl
OwotQHByb3BlcnR5IE5TUmVjdEVkZ2UgcHJlZmVycmVkRWRnZTsKLUBwcm9wZXJ0eSAocmV0YWlu
KSBJQk91dGxldCBOU1dpbmRvdyogcGFyZW50V2luZG93OwotLSAodm9pZClzaG93UHJldmlld0l0
ZW06KGlkKXByZXZpZXdJdGVtIGl0ZW1GcmFtZTooTlNSZWN0KWZyYW1lOwotLSAodm9pZClzZXRB
dXRvbWF0aWNhbGx5Q2xvc2VXaXRoTWFzazooTlNFdmVudE1hc2spYXV0b2Nsb3NlTWFzayBmaWx0
ZXJNYXNrOihOU0V2ZW50TWFzaylmaWx0ZXJNYXNrIGJsb2NrOih2b2lkICheKSh2b2lkKSlibG9j
azsKLUBlbmQKLQogI2lmIFVTRShBU1lOQ19OU1RFWFRJTlBVVENMSUVOVCkKIEBpbnRlcmZhY2Ug
TlNUZXh0SW5wdXRDb250ZXh0IChXS05TVGV4dElucHV0Q29udGV4dERldGFpbHMpCiAtICh2b2lk
KWhhbmRsZUV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQo
XikoQk9PTCBoYW5kbGVkKSljb21wbGV0aW9uSGFuZGxlcjsKQEAgLTE1Myw5ICsxNDEsNiBAQCBD
R1NDb25uZWN0aW9uSUQgQ0dTTWFpbkNvbm5lY3Rpb25JRCh2b2lkKTsKIENHRXJyb3IgQ0dTR2V0
U2NyZWVuUmVjdEZvcldpbmRvdyhDR1NDb25uZWN0aW9uSUQgY2lkLCBDR1NXaW5kb3dJRCB3aWQs
IENHUmVjdCAqcmVjdCk7CiB9OwogCi1TT0ZUX0xJTktfRlJBTUVXT1JLX0lOX1VNQlJFTExBKFF1
YXJ0eiwgSW1hZ2VLaXQpCi1TT0ZUX0xJTktfQ0xBU1MoSW1hZ2VLaXQsIElLU2xpZGVzaG93KQot
CiB1c2luZyBuYW1lc3BhY2UgV2ViS2l0OwogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAg
LTE3NiwxMyArMTYxLDYgQEAgc3RydWN0IFdLVmlld0ludGVycHJldEtleUV2ZW50c1BhcmFtZXRl
cnMgewogfTsKICNlbmRpZgogCi0vLyBGSVhNRTogVGhpcyBhbmQgYWxsIGFjdGlvbiBtZW51IHJl
bGF0ZWQgY29kZSBzaG91bGQgbW92ZSB0byBpdHMgb3duIGZpbGUuCi1lbnVtIGNsYXNzIEFjdGlv
bk1lbnVTdGF0ZSB7Ci0gICAgTm9uZSA9IDAsCi0gICAgUGVuZGluZywKLSAgICBSZWFkeQotfTsK
LQogQGludGVyZmFjZSBXS1ZpZXdEYXRhIDogTlNPYmplY3QgewogQHB1YmxpYwogICAgIHN0ZDo6
dW5pcXVlX3B0cjxQYWdlQ2xpZW50SW1wbD4gX3BhZ2VDbGllbnQ7CkBAIC0yNzksOSArMjU3LDcg
QEAgZW51bSBjbGFzcyBBY3Rpb25NZW51U3RhdGUgewogICAgIF9XS1RodW1ibmFpbFZpZXcgKl90
aHVtYm5haWxWaWV3OwogI2VuZGlmCiAKLSAgICBBY3Rpb25NZW51U3RhdGUgX2FjdGlvbk1lbnVT
dGF0ZTsKLSAgICBBY3Rpb25NZW51SGl0VGVzdFJlc3VsdCBfYWN0aW9uTWVudUhpdFRlc3RSZXN1
bHQ7Ci0gICAgUmV0YWluUHRyPE5TU2hhcmluZ1NlcnZpY2VQaWNrZXI+IF9hY3Rpb25NZW51U2hh
cmluZ1NlcnZpY2VQaWNrZXI7CisgICAgUmV0YWluUHRyPFdLQWN0aW9uTWVudUNvbnRyb2xsZXI+
IF9hY3Rpb25NZW51Q29udHJvbGxlcjsKIH0KIAogQGVuZApAQCAtMzU1NiwxMCArMzUzMiw4IEBA
IHN0YXRpYyBOU1N0cmluZyAqcGF0aFdpdGhVbmlxdWVGaWxlbmFtZUZvclBhdGgoTlNTdHJpbmcg
KnBhdGgpCiAKICAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIGFkZE9i
c2VydmVyOnNlbGYgc2VsZWN0b3I6QHNlbGVjdG9yKF9hcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6
KSBuYW1lOk5TQXBwbGljYXRpb25XaWxsVGVybWluYXRlTm90aWZpY2F0aW9uIG9iamVjdDpOU0Fw
cF07CiAKLSAgICBpZiAoW3NlbGYgcmVzcG9uZHNUb1NlbGVjdG9yOkBzZWxlY3RvcihzZXRBY3Rp
b25NZW51OildKSB7Ci0gICAgICAgIFJldGFpblB0cjxOU01lbnU+IGFjdGlvbk1lbnUgPSBhZG9w
dE5TKFtbTlNNZW51IGFsbG9jXSBpbml0XSk7Ci0gICAgICAgIFtzZWxmIHNldEFjdGlvbk1lbnU6
YWN0aW9uTWVudS5nZXQoKV07Ci0gICAgfQorICAgIGlmIChbc2VsZiByZXNwb25kc1RvU2VsZWN0
b3I6QHNlbGVjdG9yKHNldEFjdGlvbk1lbnU6KV0pCisgICAgICAgIF9kYXRhLT5fYWN0aW9uTWVu
dUNvbnRyb2xsZXIgPSBhZG9wdE5TKFtbV0tBY3Rpb25NZW51Q29udHJvbGxlciBhbGxvY10gaW5p
dFdpdGhQYWdlOipfZGF0YS0+X3BhZ2UgdmlldzpzZWxmXSk7CiAKICAgICByZXR1cm4gc2VsZjsK
IH0KQEAgLTM2NTgsMzIyICszNjMyLDI0IEBAIHN0YXRpYyBOU1N0cmluZyAqcGF0aFdpdGhVbmlx
dWVGaWxlbmFtZUZvclBhdGgoTlNTdHJpbmcgKnBhdGgpCiAgICAgICAgIF9kYXRhLT5fZ2VzdHVy
ZUNvbnRyb2xsZXItPnJlbW92ZVN3aXBlU25hcHNob3QoKTsKIH0KIAotLSAodm9pZClfb3BlblVS
TEZyb21BY3Rpb25NZW51OihpZClzZW5kZXIKLXsKLSAgICBXZWJIaXRUZXN0UmVzdWx0KiBoaXRU
ZXN0UmVzdWx0ID0gX2RhdGEtPl9wYWdlLT5hY3RpdmVBY3Rpb25NZW51SGl0VGVzdFJlc3VsdCgp
OwotICAgIGlmICghaGl0VGVzdFJlc3VsdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTlNVUkwg
KnVybCA9IFtOU1VSTCBVUkxXaXRoU3RyaW5nOmhpdFRlc3RSZXN1bHQtPmFic29sdXRlTGlua1VS
TCgpXTsKLSAgICBbW05TV29ya3NwYWNlIHNoYXJlZFdvcmtzcGFjZV0gb3BlblVSTDp1cmxdOwot
fQotCi0tICh2b2lkKV9hZGRUb1JlYWRpbmdMaXN0RnJvbUFjdGlvbk1lbnU6KGlkKXNlbmRlcgot
ewotICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhpdFRlc3RSZXN1bHQgPSBfZGF0YS0+X3BhZ2UtPmFj
dGl2ZUFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0KCk7Ci0gICAgaWYgKCFoaXRUZXN0UmVzdWx0KQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBOU1VSTCAqdXJsID0gW05TVVJMIFVSTFdpdGhTdHJpbmc6
aGl0VGVzdFJlc3VsdC0+YWJzb2x1dGVMaW5rVVJMKCldOwotICAgIE5TU2hhcmluZ1NlcnZpY2Ug
KnNlcnZpY2UgPSBbTlNTaGFyaW5nU2VydmljZSBzaGFyaW5nU2VydmljZU5hbWVkOk5TU2hhcmlu
Z1NlcnZpY2VOYW1lQWRkVG9TYWZhcmlSZWFkaW5nTGlzdF07Ci0gICAgW3NlcnZpY2UgcGVyZm9y
bVdpdGhJdGVtczpAWyB1cmwgXV07Ci19Ci0KLS0gKHZvaWQpX3F1aWNrTG9va1VSTEZyb21BY3Rp
b25NZW51OihpZClzZW5kZXIKLXsKLSAgICBXZWJIaXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0
ID0gX2RhdGEtPl9wYWdlLT5hY3RpdmVBY3Rpb25NZW51SGl0VGVzdFJlc3VsdCgpOwotICAgIGlm
ICghaGl0VGVzdFJlc3VsdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTlNSZWN0IGl0ZW1GcmFt
ZSA9IFtzZWxmIGNvbnZlcnRSZWN0OmhpdFRlc3RSZXN1bHQtPmVsZW1lbnRCb3VuZGluZ0JveCgp
IHRvVmlldzpuaWxdOwotICAgIE5TU2l6ZSBtYXhpbXVtUHJldmlld1NpemUgPSBOU01ha2VTaXpl
KHNlbGYuYm91bmRzLnNpemUud2lkdGggKiAwLjc1LCBzZWxmLmJvdW5kcy5zaXplLmhlaWdodCAq
IDAuNzUpOwotCi0gICAgUmV0YWluUHRyPFFMUHJldmlld0J1YmJsZT4gYnViYmxlID0gYWRvcHRO
UyhbW05TQ2xhc3NGcm9tU3RyaW5nKEAiUUxQcmV2aWV3QnViYmxlIikgYWxsb2NdIGluaXRdKTsK
LSAgICBbYnViYmxlIHNldFBhcmVudFdpbmRvdzpzZWxmLndpbmRvd107Ci0gICAgW2J1YmJsZSBz
ZXRNYXhpbXVtU2l6ZTptYXhpbXVtUHJldmlld1NpemVdOwotICAgIFtidWJibGUgc2V0UHJlZmVy
cmVkRWRnZTpOU01heFlFZGdlXTsKLSAgICBbYnViYmxlIHNldENvbnRyb2xzOkBbIF1dOwotICAg
IE5TRXZlbnRNYXNrIGZpbHRlck1hc2sgPSBOU0FueUV2ZW50TWFzayAmIH4oTlNBcHBLaXREZWZp
bmVkTWFzayB8IE5TU3lzdGVtRGVmaW5lZE1hc2sgfCBOU0FwcGxpY2F0aW9uRGVmaW5lZE1hc2sg
fCBOU01vdXNlRW50ZXJlZE1hc2sgfCBOU01vdXNlRXhpdGVkTWFzayk7Ci0gICAgTlNFdmVudE1h
c2sgYXV0b2Nsb3NlTWFzayA9IE5TTGVmdE1vdXNlRG93bk1hc2sgfCBOU1JpZ2h0TW91c2VEb3du
TWFzayB8IE5TS2V5RG93bk1hc2s7Ci0gICAgW2J1YmJsZSBzZXRBdXRvbWF0aWNhbGx5Q2xvc2VX
aXRoTWFzazphdXRvY2xvc2VNYXNrIGZpbHRlck1hc2s6ZmlsdGVyTWFzayBibG9jazpbYnViYmxl
XSB7Ci0gICAgICAgIFtidWJibGUgY2xvc2VdOwotICAgIH1dOwotICAgIFtidWJibGUgc2hvd1By
ZXZpZXdJdGVtOltOU1VSTCBVUkxXaXRoU3RyaW5nOmhpdFRlc3RSZXN1bHQtPmFic29sdXRlTGlu
a1VSTCgpXSBpdGVtRnJhbWU6aXRlbUZyYW1lXTsKLX0KLQotLSAoUmV0YWluUHRyPE5TTWVudUl0
ZW0+KV9jcmVhdGVBY3Rpb25NZW51SXRlbUZvclRhZzoodWludDMyX3QpdGFnCi17Ci0gICAgU0VM
IHNlbGVjdG9yID0gbmlsOwotICAgIE5TU3RyaW5nICp0aXRsZSA9IG5pbDsKLSAgICBOU0ltYWdl
ICppbWFnZSA9IG5pbDsKLQotICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgY2FzZSBrV0tDb250ZXh0
QWN0aW9uSXRlbVRhZ09wZW5MaW5rSW5EZWZhdWx0QnJvd3NlcjoKLSAgICAgICAgc2VsZWN0b3Ig
PSBAc2VsZWN0b3IoX29wZW5VUkxGcm9tQWN0aW9uTWVudTopOwotICAgICAgICB0aXRsZSA9IEAi
T3BlbiI7Ci0gICAgICAgIGltYWdlID0gd2ViS2l0QnVuZGxlSW1hZ2VOYW1lZChAIk9wZW5Jbk5l
d1dpbmRvd1RlbXBsYXRlIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrV0tDb250ZXh0
QWN0aW9uSXRlbVRhZ1ByZXZpZXdMaW5rOgotICAgICAgICBzZWxlY3RvciA9IEBzZWxlY3Rvcihf
cXVpY2tMb29rVVJMRnJvbUFjdGlvbk1lbnU6KTsKLSAgICAgICAgdGl0bGUgPSBAIlByZXZpZXci
OwotICAgICAgICBpbWFnZSA9IFtOU0ltYWdlIGltYWdlTmFtZWQ6TlNJbWFnZU5hbWVRdWlja0xv
b2tUZW1wbGF0ZV07Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrV0tDb250ZXh0QWN0aW9u
SXRlbVRhZ0FkZExpbmtUb1NhZmFyaVJlYWRpbmdMaXN0OgotICAgICAgICBzZWxlY3RvciA9IEBz
ZWxlY3RvcihfYWRkVG9SZWFkaW5nTGlzdEZyb21BY3Rpb25NZW51Oik7Ci0gICAgICAgIHRpdGxl
ID0gQCJBZGQgdG8gU2FmYXJpIFJlYWRpbmcgTGlzdCI7Ci0gICAgICAgIGltYWdlID0gW05TSW1h
Z2UgaW1hZ2VOYW1lZDpOU0ltYWdlTmFtZUJvb2ttYXJrc1RlbXBsYXRlXTsKLSAgICAgICAgYnJl
YWs7Ci0KLSAgICBjYXNlIGtXS0NvbnRleHRBY3Rpb25JdGVtVGFnQ29weUltYWdlOgotICAgICAg
ICBzZWxlY3RvciA9IEBzZWxlY3RvcihfY29weUltYWdlOik7Ci0gICAgICAgIHRpdGxlID0gQCJD
b3B5IjsKLSAgICAgICAgaW1hZ2UgPSB3ZWJLaXRCdW5kbGVJbWFnZU5hbWVkKEAiQ29weUltYWdl
VGVtcGxhdGUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtXS0NvbnRleHRBY3Rpb25J
dGVtVGFnQWRkSW1hZ2VUb1Bob3RvczoKLSAgICAgICAgc2VsZWN0b3IgPSBAc2VsZWN0b3IoX2Fk
ZEltYWdlVG9QaG90b3M6KTsKLSAgICAgICAgdGl0bGUgPSBAIkFkZCB0byBQaG90b3MiOwotICAg
ICAgICBpbWFnZSA9IHdlYktpdEJ1bmRsZUltYWdlTmFtZWQoQCJBZGRJbWFnZVRvUGhvdG9zVGVt
cGxhdGUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtXS0NvbnRleHRBY3Rpb25JdGVt
VGFnU2F2ZUltYWdlVG9Eb3dubG9hZHM6Ci0gICAgICAgIHNlbGVjdG9yID0gQHNlbGVjdG9yKF9z
YXZlSW1hZ2VUb0Rvd25sb2FkczopOwotICAgICAgICB0aXRsZSA9IEAiU2F2ZSB0byBEb3dubG9h
ZHMiOwotICAgICAgICBpbWFnZSA9IHdlYktpdEJ1bmRsZUltYWdlTmFtZWQoQCJTYXZlSW1hZ2VU
b0Rvd25sb2Fkc1RlbXBsYXRlIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrV0tDb250
ZXh0QWN0aW9uSXRlbVRhZ1NoYXJlSW1hZ2U6Ci0gICAgICAgIHRpdGxlID0gQCJTaGFyZSI7Ci0g
ICAgICAgIGltYWdlID0gd2ViS2l0QnVuZGxlSW1hZ2VOYW1lZChAIlNoYXJlSW1hZ2VUZW1wbGF0
ZSIpOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gbmlsOwotICAgIH0KLQotICAgIFJldGFpblB0cjxO
U01lbnVJdGVtPiBpdGVtID0gYWRvcHROUyhbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0
bGU6dGl0bGUgYWN0aW9uOnNlbGVjdG9yIGtleUVxdWl2YWxlbnQ6QCIiXSk7Ci0gICAgW2l0ZW0g
c2V0SW1hZ2U6aW1hZ2VdOwotICAgIFtpdGVtIHNldFRhcmdldDpzZWxmXTsKLSAgICBbaXRlbSBz
ZXRUYWc6dGFnXTsKLSAgICByZXR1cm4gaXRlbTsKLX0KLQotc3RhdGljIE5TSW1hZ2UgKndlYktp
dEJ1bmRsZUltYWdlTmFtZWQoTlNTdHJpbmcgKm5hbWUpCi17Ci0gICAgcmV0dXJuIFtbTlNCdW5k
bGUgYnVuZGxlRm9yQ2xhc3M6W1dLVmlldyBjbGFzc11dIGltYWdlRm9yUmVzb3VyY2U6bmFtZV07
Ci19Ci0KLS0gKE5TQXJyYXkgKilfZGVmYXVsdE1lbnVJdGVtc0ZvckxpbmsKLXsKLSAgICBXZWJI
aXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0ID0gX2RhdGEtPl9wYWdlLT5hY3RpdmVBY3Rpb25N
ZW51SGl0VGVzdFJlc3VsdCgpOwotICAgIGlmICghaGl0VGVzdFJlc3VsdCkKLSAgICAgICAgcmV0
dXJuIEBbIF07Ci0KLSAgICBpZiAoIVdlYkNvcmU6OnByb3RvY29sSXNJbkhUVFBGYW1pbHkoaGl0
VGVzdFJlc3VsdC0+YWJzb2x1dGVMaW5rVVJMKCkpKQotICAgICAgICByZXR1cm4gQFsgXTsKLQot
ICAgIFJldGFpblB0cjxOU01lbnVJdGVtPiBvcGVuTGlua0l0ZW0gPSBbc2VsZiBfY3JlYXRlQWN0
aW9uTWVudUl0ZW1Gb3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdPcGVuTGlua0luRGVmYXVs
dEJyb3dzZXJdOwotICAgIFJldGFpblB0cjxOU01lbnVJdGVtPiBwcmV2aWV3TGlua0l0ZW0gPSBb
c2VsZiBfY3JlYXRlQWN0aW9uTWVudUl0ZW1Gb3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdQ
cmV2aWV3TGlua107Ci0gICAgUmV0YWluUHRyPE5TTWVudUl0ZW0+IHJlYWRpbmdMaXN0SXRlbSA9
IFtzZWxmIF9jcmVhdGVBY3Rpb25NZW51SXRlbUZvclRhZzprV0tDb250ZXh0QWN0aW9uSXRlbVRh
Z0FkZExpbmtUb1NhZmFyaVJlYWRpbmdMaXN0XTsKLQotICAgIC8vIEZJWE1FOiBUaGUgc2VwYXJh
dG9yIGl0ZW0gaXMgcmVxdWlyZWQgdG8gd29yayBhcm91bmQgPHJkYXI6Ly8xODY4NDIwNz4uCi0g
ICAgcmV0dXJuIEBbb3BlbkxpbmtJdGVtLmdldCgpLCBwcmV2aWV3TGlua0l0ZW0uZ2V0KCksIFtO
U01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dLCByZWFkaW5nTGlzdEl0ZW0uZ2V0KCldOwotfQotCi0t
ICh2b2lkKV9jb3B5SW1hZ2U6KGlkKXNlbmRlcgotewotICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhp
dFRlc3RSZXN1bHQgPSBfZGF0YS0+X3BhZ2UtPmFjdGl2ZUFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0
KCk7Ci0gICAgaWYgKCFoaXRUZXN0UmVzdWx0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZWZQ
dHI8U2hhcmVhYmxlQml0bWFwPiBiaXRtYXAgPSBfZGF0YS0+X2FjdGlvbk1lbnVIaXRUZXN0UmVz
dWx0LmltYWdlOwotICAgIGlmICghYml0bWFwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZXRh
aW5QdHI8Q0dJbWFnZVJlZj4gaW1hZ2UgPSBiaXRtYXAtPm1ha2VDR0ltYWdlKCk7Ci0gICAgUmV0
YWluUHRyPE5TSW1hZ2U+IG5zSW1hZ2UgPSBhZG9wdE5TKFtbTlNJbWFnZSBhbGxvY10gaW5pdFdp
dGhDR0ltYWdlOmltYWdlLmdldCgpIHNpemU6TlNaZXJvU2l6ZV0pOwotICAgIFtbTlNQYXN0ZWJv
YXJkIGdlbmVyYWxQYXN0ZWJvYXJkXSBjbGVhckNvbnRlbnRzXTsKLSAgICBbW05TUGFzdGVib2Fy
ZCBnZW5lcmFsUGFzdGVib2FyZF0gd3JpdGVPYmplY3RzOkBbIG5zSW1hZ2UuZ2V0KCkgXV07Ci19
Ci0KLS0gKHZvaWQpX3NhdmVJbWFnZVRvRG93bmxvYWRzOihpZClzZW5kZXIKLXsKLSAgICBXZWJI
aXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0ID0gX2RhdGEtPl9wYWdlLT5hY3RpdmVBY3Rpb25N
ZW51SGl0VGVzdFJlc3VsdCgpOwotICAgIGlmICghaGl0VGVzdFJlc3VsdCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgX2RhdGEtPl9wYWdlLT5wcm9jZXNzKCkuY29udGV4dCgpLmRvd25sb2FkKF9k
YXRhLT5fcGFnZS5nZXQoKSwgVVJMKFVSTCgpLCBoaXRUZXN0UmVzdWx0LT5hYnNvbHV0ZUltYWdl
VVJMKCkpKTsKLX0KLQotc3RhdGljIE5TU3RyaW5nICp0ZW1wb3JhcnlQaG90b3NEaXJlY3RvcnlQ
YXRoKCkKLXsKLSAgICBzdGF0aWMgTlNTdHJpbmcgKnRlbXBvcmFyeVBob3Rvc0RpcmVjdG9yeVBh
dGg7Ci0KLSAgICBpZiAoIXRlbXBvcmFyeVBob3Rvc0RpcmVjdG9yeVBhdGgpIHsKLSAgICAgICAg
TlNTdHJpbmcgKnRlbXBvcmFyeURpcmVjdG9yeVRlbXBsYXRlID0gW05TVGVtcG9yYXJ5RGlyZWN0
b3J5KCkgc3RyaW5nQnlBcHBlbmRpbmdQYXRoQ29tcG9uZW50OkAiV2ViS2l0UGhvdG9zLVhYWFhY
WCJdOwotICAgICAgICBDU3RyaW5nIHRlbXBsYXRlUmVwcmVzZW50YXRpb24gPSBbdGVtcG9yYXJ5
RGlyZWN0b3J5VGVtcGxhdGUgZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXTsKLQotICAgICAgICBp
ZiAobWtkdGVtcCh0ZW1wbGF0ZVJlcHJlc2VudGF0aW9uLm11dGFibGVEYXRhKCkpKQotICAgICAg
ICAgICAgdGVtcG9yYXJ5UGhvdG9zRGlyZWN0b3J5UGF0aCA9IFtbW05TRmlsZU1hbmFnZXIgZGVm
YXVsdE1hbmFnZXJdIHN0cmluZ1dpdGhGaWxlU3lzdGVtUmVwcmVzZW50YXRpb246dGVtcGxhdGVS
ZXByZXNlbnRhdGlvbi5kYXRhKCkgbGVuZ3RoOnRlbXBsYXRlUmVwcmVzZW50YXRpb24ubGVuZ3Ro
KCldIGNvcHldOwotICAgIH0KLQotICAgIHJldHVybiB0ZW1wb3JhcnlQaG90b3NEaXJlY3RvcnlQ
YXRoOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKnBhdGhUb1Bob3RvT25EaXNrKE5TU3RyaW5nICpz
dWdnZXN0ZWRGaWxlbmFtZSkKLXsKLSAgICBOU1N0cmluZyAqcGhvdG9EaXJlY3RvcnlQYXRoID0g
dGVtcG9yYXJ5UGhvdG9zRGlyZWN0b3J5UGF0aCgpOwotICAgIGlmICghcGhvdG9EaXJlY3RvcnlQ
YXRoKSB7Ci0gICAgICAgIFdURkxvZ0Fsd2F5cygiQ2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgcGhv
dG8gZG93bmxvYWQgZGlyZWN0b3J5LiIpOwotICAgICAgICByZXR1cm4gbmlsOwotICAgIH0KLQot
ICAgIE5TU3RyaW5nICpwYXRoID0gW3Bob3RvRGlyZWN0b3J5UGF0aCBzdHJpbmdCeUFwcGVuZGlu
Z1BhdGhDb21wb25lbnQ6c3VnZ2VzdGVkRmlsZW5hbWVdOwotCi0gICAgTlNGaWxlTWFuYWdlciAq
ZmlsZU1hbmFnZXIgPSBbTlNGaWxlTWFuYWdlciBkZWZhdWx0TWFuYWdlcl07Ci0gICAgaWYgKFtm
aWxlTWFuYWdlciBmaWxlRXhpc3RzQXRQYXRoOnBhdGhdKSB7Ci0gICAgICAgIE5TU3RyaW5nICpw
YXRoVGVtcGxhdGVQcmVmaXggPSBbcGhvdG9EaXJlY3RvcnlQYXRoIHN0cmluZ0J5QXBwZW5kaW5n
UGF0aENvbXBvbmVudDpAIlhYWFhYWC0iXTsKLSAgICAgICAgTlNTdHJpbmcgKnBhdGhUZW1wbGF0
ZSA9IFtwYXRoVGVtcGxhdGVQcmVmaXggc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6c3VnZ2VzdGVk
RmlsZW5hbWVdOwotICAgICAgICBDU3RyaW5nIHBhdGhUZW1wbGF0ZVJlcHJlc2VudGF0aW9uID0g
W3BhdGhUZW1wbGF0ZSBmaWxlU3lzdGVtUmVwcmVzZW50YXRpb25dOwotCi0gICAgICAgIGludCBm
ZCA9IG1rc3RlbXBzKHBhdGhUZW1wbGF0ZVJlcHJlc2VudGF0aW9uLm11dGFibGVEYXRhKCksIHBh
dGhUZW1wbGF0ZVJlcHJlc2VudGF0aW9uLmxlbmd0aCgpIC0gc3RybGVuKFtwYXRoVGVtcGxhdGVQ
cmVmaXggZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXSkgKyAxKTsKLSAgICAgICAgaWYgKGZkIDwg
MCkgewotICAgICAgICAgICAgV1RGTG9nQWx3YXlzKCJDYW5ub3QgY3JlYXRlIHBob3RvIGZpbGUg
aW4gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgKCVAKS4iLCBzdWdnZXN0ZWRGaWxlbmFtZSk7Ci0g
ICAgICAgICAgICByZXR1cm4gbmlsOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xvc2UoZmQpOwot
ICAgICAgICBwYXRoID0gW2ZpbGVNYW5hZ2VyIHN0cmluZ1dpdGhGaWxlU3lzdGVtUmVwcmVzZW50
YXRpb246cGF0aFRlbXBsYXRlUmVwcmVzZW50YXRpb24uZGF0YSgpIGxlbmd0aDpwYXRoVGVtcGxh
dGVSZXByZXNlbnRhdGlvbi5sZW5ndGgoKV07Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhdGg7Ci19
Ci0KLS0gKHZvaWQpX2FkZEltYWdlVG9QaG90b3M6KGlkKXNlbmRlcgotewotICAgIC8vIEZJWE1F
OiBXZSBzaG91bGRuJ3QgZXZlbiBhZGQgdGhlIGJ1dHRvbiBpZiB0aGlzIGlzIHRoZSBjYXNlLCBm
b3Igbm93LgotICAgIGlmICghW2dldElLU2xpZGVzaG93Q2xhc3MoKSBjYW5FeHBvcnRUb0FwcGxp
Y2F0aW9uOihAImNvbS5hcHBsZS5QaG90b3MiKV0pCi0gICAgICAgIHJldHVybjsKLQotICAgIFdl
YkhpdFRlc3RSZXN1bHQqIGhpdFRlc3RSZXN1bHQgPSBfZGF0YS0+X3BhZ2UtPmFjdGl2ZUFjdGlv
bk1lbnVIaXRUZXN0UmVzdWx0KCk7Ci0gICAgaWYgKCFoaXRUZXN0UmVzdWx0KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBSZWZQdHI8U2hhcmVhYmxlQml0bWFwPiBiaXRtYXAgPSBfZGF0YS0+X2Fj
dGlvbk1lbnVIaXRUZXN0UmVzdWx0LmltYWdlOwotICAgIGlmICghYml0bWFwKQotICAgICAgICBy
ZXR1cm47Ci0gICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGltYWdlID0gYml0bWFwLT5tYWtlQ0dJ
bWFnZSgpOwotCi0gICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X2dsb2JhbF9xdWV1ZShE
SVNQQVRDSF9RVUVVRV9QUklPUklUWV9ERUZBVUxULCAwKSwgXnsKLSAgICAgICAgTlNTdHJpbmcg
KiBjb25zdCBzdWdnZXN0ZWRGaWxlbmFtZSA9IEAiaW1hZ2UuanBnIjsKLQotICAgICAgICBOU1N0
cmluZyAqZmlsZVBhdGggPSBwYXRoVG9QaG90b09uRGlzayhzdWdnZXN0ZWRGaWxlbmFtZSk7Ci0g
ICAgICAgIGlmICghZmlsZVBhdGgpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgTlNV
UkwgKmZpbGVVUkwgPSBbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOmZpbGVQYXRoXTsKLSAgICAgICAg
YXV0byBkZXN0ID0gYWRvcHRDRihDR0ltYWdlRGVzdGluYXRpb25DcmVhdGVXaXRoVVJMKChDRlVS
TFJlZilmaWxlVVJMLCBrVVRUeXBlSlBFRywgMSwgbnVsbHB0cikpOwotICAgICAgICBDR0ltYWdl
RGVzdGluYXRpb25BZGRJbWFnZShkZXN0LmdldCgpLCBpbWFnZS5nZXQoKSwgbnVsbHB0cik7Ci0g
ICAgICAgIENHSW1hZ2VEZXN0aW5hdGlvbkZpbmFsaXplKGRlc3QuZ2V0KCkpOwotCi0gICAgICAg
IGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57Ci0gICAgICAgICAg
ICAvLyBUaGlzIEFQSSBwcm92aWRlcyBubyB3YXkgdG8gcmVwb3J0IGZhaWx1cmUsIGJ1dCBpZiAx
ODQyMDc3OCBpcyBmaXhlZCBzbyB0aGF0IGl0IGRvZXMsIHdlIHNob3VsZCBoYW5kbGUgdGhpcy4K
LSAgICAgICAgICAgIFtnZXRJS1NsaWRlc2hvd0NsYXNzKCkgZXhwb3J0U2xpZGVzaG93SXRlbTpm
aWxlUGF0aCB0b0FwcGxpY2F0aW9uOihAImNvbS5hcHBsZS5QaG90b3MiKV07Ci0gICAgICAgIH0p
OwotICAgIH0pOwotfQotCi0tIChOU0FycmF5ICopX2RlZmF1bHRNZW51SXRlbXNGb3JJbWFnZQot
ewotICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhpdFRlc3RSZXN1bHQgPSBfZGF0YS0+X3BhZ2UtPmFj
dGl2ZUFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0KCk7Ci0gICAgaWYgKCFoaXRUZXN0UmVzdWx0KQot
ICAgICAgICByZXR1cm4gQFsgXTsKLQotICAgIFJldGFpblB0cjxOU01lbnVJdGVtPiBjb3B5SW1h
Z2VJdGVtID0gW3NlbGYgX2NyZWF0ZUFjdGlvbk1lbnVJdGVtRm9yVGFnOmtXS0NvbnRleHRBY3Rp
b25JdGVtVGFnQ29weUltYWdlXTsKLSAgICBSZXRhaW5QdHI8TlNNZW51SXRlbT4gYWRkVG9QaG90
b3NJdGVtID0gW3NlbGYgX2NyZWF0ZUFjdGlvbk1lbnVJdGVtRm9yVGFnOmtXS0NvbnRleHRBY3Rp
b25JdGVtVGFnQWRkSW1hZ2VUb1Bob3Rvc107Ci0gICAgUmV0YWluUHRyPE5TTWVudUl0ZW0+IHNh
dmVUb0Rvd25sb2Fkc0l0ZW0gPSBbc2VsZiBfY3JlYXRlQWN0aW9uTWVudUl0ZW1Gb3JUYWc6a1dL
Q29udGV4dEFjdGlvbkl0ZW1UYWdTYXZlSW1hZ2VUb0Rvd25sb2Fkc107Ci0gICAgUmV0YWluUHRy
PE5TTWVudUl0ZW0+IHNoYXJlSXRlbSA9IFtzZWxmIF9jcmVhdGVBY3Rpb25NZW51SXRlbUZvclRh
ZzprV0tDb250ZXh0QWN0aW9uSXRlbVRhZ1NoYXJlSW1hZ2VdOwotCi0gICAgaWYgKFJlZlB0cjxT
aGFyZWFibGVCaXRtYXA+IGJpdG1hcCA9IF9kYXRhLT5fYWN0aW9uTWVudUhpdFRlc3RSZXN1bHQu
aW1hZ2UpIHsKLSAgICAgICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGltYWdlID0gYml0bWFwLT5t
YWtlQ0dJbWFnZSgpOwotICAgICAgICBSZXRhaW5QdHI8TlNJbWFnZT4gbnNJbWFnZSA9IGFkb3B0
TlMoW1tOU0ltYWdlIGFsbG9jXSBpbml0V2l0aENHSW1hZ2U6aW1hZ2UuZ2V0KCkgc2l6ZTpOU1pl
cm9TaXplXSk7Ci0gICAgICAgIF9kYXRhLT5fYWN0aW9uTWVudVNoYXJpbmdTZXJ2aWNlUGlja2Vy
ID0gYWRvcHROUyhbW05TU2hhcmluZ1NlcnZpY2VQaWNrZXIgYWxsb2NdIGluaXRXaXRoSXRlbXM6
QFsgbnNJbWFnZS5nZXQoKSBdXSk7Ci0gICAgICAgIFtzaGFyZUl0ZW0gc2V0U3VibWVudTpbX2Rh
dGEtPl9hY3Rpb25NZW51U2hhcmluZ1NlcnZpY2VQaWNrZXIgbWVudV1dOwotICAgICB9Ci0KLSAg
ICByZXR1cm4gQFtjb3B5SW1hZ2VJdGVtLmdldCgpLCBhZGRUb1Bob3Rvc0l0ZW0uZ2V0KCksIHNh
dmVUb0Rvd25sb2Fkc0l0ZW0uZ2V0KCksIHNoYXJlSXRlbS5nZXQoKV07Ci19Ci0KLS0gKE5TQXJy
YXkgKilfZGVmYXVsdE1lbnVJdGVtcwotewotICAgIGlmIChXZWJIaXRUZXN0UmVzdWx0KiBoaXRU
ZXN0UmVzdWx0ID0gX2RhdGEtPl9wYWdlLT5hY3RpdmVBY3Rpb25NZW51SGl0VGVzdFJlc3VsdCgp
KSB7Ci0gICAgICAgIGlmICghaGl0VGVzdFJlc3VsdC0+YWJzb2x1dGVJbWFnZVVSTCgpLmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIHJldHVybiBbc2VsZiBfZGVmYXVsdE1lbnVJdGVtc0ZvckltYWdl
XTsKLSAgICAgICAgaWYgKCFoaXRUZXN0UmVzdWx0LT5hYnNvbHV0ZUxpbmtVUkwoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICByZXR1cm4gW3NlbGYgX2RlZmF1bHRNZW51SXRlbXNGb3JMaW5rXTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gQFsgXTsKLX0KLQotLSAodm9pZClfdXBkYXRlQWN0aW9uTWVu
dQotewotICAgIFtbc2VsZiBhY3Rpb25NZW51XSByZW1vdmVBbGxJdGVtc107Ci0KLSAgICBOU0Fy
cmF5ICptZW51SXRlbXMgPSBbc2VsZiBfYWN0aW9uTWVudUl0ZW1zRm9ySGl0VGVzdFJlc3VsdDp0
b0FQSShfZGF0YS0+X3BhZ2UtPmFjdGl2ZUFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0KCkpIGRlZmF1
bHRBY3Rpb25NZW51SXRlbXM6W3NlbGYgX2RlZmF1bHRNZW51SXRlbXNdXTsKLQotICAgIGZvciAo
TlNNZW51SXRlbSAqaXRlbSBpbiBtZW51SXRlbXMpCi0gICAgICAgIFtbc2VsZiBhY3Rpb25NZW51
XSBhZGRJdGVtOml0ZW1dOwotfQotCiAtICh2b2lkKXByZXBhcmVGb3JNZW51OihOU01lbnUgKilt
ZW51IHdpdGhFdmVudDooTlNFdmVudCAqKWV2ZW50CiB7Ci0gICAgaWYgKG1lbnUgIT0gc2VsZi5h
Y3Rpb25NZW51KQotICAgICAgICByZXR1cm47Ci0KLSAgICBbc2VsZiBfdXBkYXRlQWN0aW9uTWVu
dV07Ci0KLSAgICBfZGF0YS0+X3BhZ2UtPnBlcmZvcm1BY3Rpb25NZW51SGl0VGVzdEF0TG9jYXRp
b24oW3NlbGYgY29udmVydFBvaW50OltldmVudCBsb2NhdGlvbkluV2luZG93XSBmcm9tVmlldzpu
aWxdKTsKLQotICAgIF9kYXRhLT5fYWN0aW9uTWVudVN0YXRlID0gQWN0aW9uTWVudVN0YXRlOjpQ
ZW5kaW5nOwotfQotCi0tICh2b2lkKV9kaWRQZXJmb3JtQWN0aW9uTWVudUhpdFRlc3Q6KGNvbnN0
IEFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0JiloaXRUZXN0UmVzdWx0Ci17Ci0gICAgLy8gRklYTUU6
IFRoaXMgbmVlZHMgdG8gdXNlIHRoZSBXZWJLaXQyIGNhbGxiYWNrIG1lY2hhbmlzbSB0byBhdm9p
ZCBvdXQtb2Ytb3JkZXIgcmVwbGllcy4KLSAgICBfZGF0YS0+X2FjdGlvbk1lbnVTdGF0ZSA9IEFj
dGlvbk1lbnVTdGF0ZTo6UmVhZHk7Ci0gICAgX2RhdGEtPl9hY3Rpb25NZW51SGl0VGVzdFJlc3Vs
dCA9IGhpdFRlc3RSZXN1bHQ7CisgICAgW19kYXRhLT5fYWN0aW9uTWVudUNvbnRyb2xsZXIgcHJl
cGFyZUZvck1lbnU6bWVudSB3aXRoRXZlbnQ6ZXZlbnRdOwogfQogCiAtICh2b2lkKXdpbGxPcGVu
TWVudTooTlNNZW51ICopbWVudSB3aXRoRXZlbnQ6KE5TRXZlbnQgKilldmVudAogewotICAgIGlm
IChtZW51ICE9IHNlbGYuYWN0aW9uTWVudSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJU
KF9kYXRhLT5fYWN0aW9uTWVudVN0YXRlICE9IEFjdGlvbk1lbnVTdGF0ZTo6Tm9uZSk7Ci0KLSAg
ICAvLyBGSVhNRTogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNhbmNlbCB0aGlzIGlmIHRoZSBtZW51
IGdvZXMgYXdheS4KLSAgICAvLyBGSVhNRTogQ29ubmVjdGlvbiBjYW4gYmUgbnVsbCBpZiB0aGUg
cHJvY2VzcyBpcyBjbG9zZWQ7IHdlIHNob3VsZCBjbGVhbiB1cCBiZXR0ZXIgaW4gdGhhdCBjYXNl
LgotICAgIGlmIChfZGF0YS0+X2FjdGlvbk1lbnVTdGF0ZSA9PSBBY3Rpb25NZW51U3RhdGU6OlBl
bmRpbmcpIHsKLSAgICAgICAgaWYgKGF1dG8qIGNvbm5lY3Rpb24gPSBfZGF0YS0+X3BhZ2UtPnBy
b2Nlc3MoKS5jb25uZWN0aW9uKCkpCi0gICAgICAgICAgICBjb25uZWN0aW9uLT53YWl0Rm9yQW5k
RGlzcGF0Y2hJbW1lZGlhdGVseTxNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpEaWRQZXJmb3JtQWN0
aW9uTWVudUhpdFRlc3Q+KF9kYXRhLT5fcGFnZS0+cGFnZUlEKCksIHN0ZDo6Y2hyb25vOjptaWxs
aXNlY29uZHMoNTAwKSk7Ci0gICAgfQotCi0gICAgaWYgKF9kYXRhLT5fYWN0aW9uTWVudVN0YXRl
ID09IEFjdGlvbk1lbnVTdGF0ZTo6UmVhZHkpCi0gICAgICAgIFtzZWxmIF91cGRhdGVBY3Rpb25N
ZW51XTsKKyAgICBbX2RhdGEtPl9hY3Rpb25NZW51Q29udHJvbGxlciB3aWxsT3Blbk1lbnU6bWVu
dSB3aXRoRXZlbnQ6ZXZlbnRdOwogfQogCiAtICh2b2lkKWRpZENsb3NlTWVudTooTlNNZW51ICop
bWVudSB3aXRoRXZlbnQ6KE5TRXZlbnQgKilldmVudAogewotICAgIGlmIChtZW51ICE9IHNlbGYu
YWN0aW9uTWVudSkKLSAgICAgICAgcmV0dXJuOworICAgIFtfZGF0YS0+X2FjdGlvbk1lbnVDb250
cm9sbGVyIGRpZENsb3NlTWVudTptZW51IHdpdGhFdmVudDpldmVudF07Cit9CiAKLSAgICBfZGF0
YS0+X2FjdGlvbk1lbnVTdGF0ZSA9IEFjdGlvbk1lbnVTdGF0ZTo6Tm9uZTsKLSAgICBfZGF0YS0+
X2FjdGlvbk1lbnVIaXRUZXN0UmVzdWx0ID0gQWN0aW9uTWVudUhpdFRlc3RSZXN1bHQoKTsKLSAg
ICBfZGF0YS0+X2FjdGlvbk1lbnVTaGFyaW5nU2VydmljZVBpY2tlciA9IG5pbDsKKy0gKHZvaWQp
X2RpZFBlcmZvcm1BY3Rpb25NZW51SGl0VGVzdDooY29uc3QgQWN0aW9uTWVudUhpdFRlc3RSZXN1
bHQmKWhpdFRlc3RSZXN1bHQKK3sKKyAgICBbX2RhdGEtPl9hY3Rpb25NZW51Q29udHJvbGxlciBk
aWRQZXJmb3JtQWN0aW9uTWVudUhpdFRlc3Q6aGl0VGVzdFJlc3VsdF07CiB9CiAKIEBlbmQKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9tYWMvV0tBY3Rpb25NZW51Q29udHJv
bGxlci5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL21hYy9XS0FjdGlvbk1lbnVDb250cm9s
bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uNDEzNmZkODU5MmE2NjNjMWU5ZGQ2YTJmNTk4YzJjYjJkMjUwODQz
MwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9tYWMvV0tBY3Rp
b25NZW51Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVm
IFdLQWN0aW9uTWVudUNvbnRyb2xsZXJfaAorI2RlZmluZSBXS0FjdGlvbk1lbnVDb250cm9sbGVy
X2gKKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJQYWdlUHJveHk7CitzdHJ1Y3QgQWN0
aW9uTWVudUhpdFRlc3RSZXN1bHQ7Cit9CisKK0BjbGFzcyBXS1ZpZXc7CisKK0BpbnRlcmZhY2Ug
V0tBY3Rpb25NZW51Q29udHJvbGxlciA6IE5TT2JqZWN0CisKKy0gKGluc3RhbmNldHlwZSlpbml0
V2l0aFBhZ2U6KFdlYktpdDo6V2ViUGFnZVByb3h5JilwYWdlIHZpZXc6KFdLVmlldyAqKXdrVmll
dzsKKworLSAodm9pZClwcmVwYXJlRm9yTWVudTooTlNNZW51ICopbWVudSB3aXRoRXZlbnQ6KE5T
RXZlbnQgKilldmVudDsKKy0gKHZvaWQpd2lsbE9wZW5NZW51OihOU01lbnUgKiltZW51IHdpdGhF
dmVudDooTlNFdmVudCAqKWV2ZW50OworLSAodm9pZClkaWRDbG9zZU1lbnU6KE5TTWVudSAqKW1l
bnUgd2l0aEV2ZW50OihOU0V2ZW50ICopZXZlbnQ7CisKKy0gKHZvaWQpZGlkUGVyZm9ybUFjdGlv
bk1lbnVIaXRUZXN0Oihjb25zdCBXZWJLaXQ6OkFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0JiloaXRU
ZXN0UmVzdWx0OworCitAZW5kCisKKyNlbmRpZiAvLyBXS0FjdGlvbk1lbnVDb250cm9sbGVyX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9tYWMvV0tBY3Rpb25NZW51Q29u
dHJvbGxlci5tbSBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9tYWMvV0tBY3Rpb25NZW51Q29u
dHJvbGxlci5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kMDRjYjk2YjkwZDIzMDMwOGE4MDQ3NTA1NDA2Mzg0MmRm
NjY1NjIxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL21hYy9X
S0FjdGlvbk1lbnVDb250cm9sbGVyLm1tCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJXS0FjdGlvbk1lbnVDb250cm9sbGVyLmgiCisK
KyNpZiBQTEFURk9STShNQUMpCisKKyNpbXBvcnQgIkFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0Lmgi
CisjaW1wb3J0ICJXS0FjdGlvbk1lbnVJdGVtVHlwZXMuaCIKKyNpbXBvcnQgIldLVmlld0ludGVy
bmFsLmgiCisjaW1wb3J0ICJXZWJDb250ZXh0LmgiCisjaW1wb3J0ICJXZWJQYWdlTWVzc2FnZXMu
aCIKKyNpbXBvcnQgIldlYlBhZ2VQcm94eS5oIgorI2ltcG9ydCAiV2ViUGFnZVByb3h5TWVzc2Fn
ZXMuaCIKKyNpbXBvcnQgIldlYlByb2Nlc3NQcm94eS5oIgorI2ltcG9ydCA8SW1hZ2VJTy9JbWFn
ZUlPLmg+CisjaW1wb3J0IDxJbWFnZUtpdC9JbWFnZUtpdC5oPgorI2ltcG9ydCA8V2ViQ29yZS9O
U1NoYXJpbmdTZXJ2aWNlUGlja2VyU1BJLmg+CisjaW1wb3J0IDxXZWJDb3JlL05TVmlld1NQSS5o
PgorI2ltcG9ydCA8V2ViQ29yZS9Tb2Z0TGlua2luZy5oPgorI2ltcG9ydCA8V2ViQ29yZS9VUkwu
aD4KKworLy8gRklYTUU6IFRoaXMgc2hvdWxkIG1vdmUgaW50byBhbiBTUEkgaGVhZGVyIGlmIGl0
IHN0YXlzLgorQGNsYXNzIFFMUHJldmlld0J1YmJsZTsKK0BpbnRlcmZhY2UgTlNPYmplY3QgKFdL
UUxQcmV2aWV3QnViYmxlRGV0YWlscykKK0Bwcm9wZXJ0eSAoY29weSkgTlNBcnJheSAqIGNvbnRy
b2xzOworQHByb3BlcnR5IE5TU2l6ZSBtYXhpbXVtU2l6ZTsKK0Bwcm9wZXJ0eSBOU1JlY3RFZGdl
IHByZWZlcnJlZEVkZ2U7CitAcHJvcGVydHkgKHJldGFpbikgSUJPdXRsZXQgTlNXaW5kb3cqIHBh
cmVudFdpbmRvdzsKKy0gKHZvaWQpc2hvd1ByZXZpZXdJdGVtOihpZClwcmV2aWV3SXRlbSBpdGVt
RnJhbWU6KE5TUmVjdClmcmFtZTsKKy0gKHZvaWQpc2V0QXV0b21hdGljYWxseUNsb3NlV2l0aE1h
c2s6KE5TRXZlbnRNYXNrKWF1dG9jbG9zZU1hc2sgZmlsdGVyTWFzazooTlNFdmVudE1hc2spZmls
dGVyTWFzayBibG9jazoodm9pZCAoXikodm9pZCkpYmxvY2s7CitAZW5kCisKK1NPRlRfTElOS19G
UkFNRVdPUktfSU5fVU1CUkVMTEEoUXVhcnR6LCBJbWFnZUtpdCkKK1NPRlRfTElOS19DTEFTUyhJ
bWFnZUtpdCwgSUtTbGlkZXNob3cpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcg
bmFtZXNwYWNlIFdlYktpdDsKKworZW51bSBjbGFzcyBBY3Rpb25NZW51U3RhdGUgeworICAgIE5v
bmUgPSAwLAorICAgIFBlbmRpbmcsCisgICAgUmVhZHkKK307CisKK0BpbnRlcmZhY2UgV0tBY3Rp
b25NZW51Q29udHJvbGxlciAoSW50ZXJuYWwpCistICh2b2lkKV91cGRhdGVBY3Rpb25NZW51SXRl
bXM7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXS0FjdGlvbk1lbnVDb250cm9sbGVyIHsKKyAg
ICBXZWJQYWdlUHJveHkgKl9wYWdlOworICAgIFdLVmlldyAqX3drVmlldzsKKyAgICBSZXRhaW5Q
dHI8TlNNZW51PiBfbWVudTsKKworICAgIEFjdGlvbk1lbnVTdGF0ZSBfc3RhdGU7CisgICAgQWN0
aW9uTWVudUhpdFRlc3RSZXN1bHQgX2hpdFRlc3RSZXN1bHQ7CisgICAgUmV0YWluUHRyPE5TU2hh
cmluZ1NlcnZpY2VQaWNrZXI+IF9zaGFyaW5nU2VydmljZVBpY2tlcjsKK30KKworLSAoaW5zdGFu
Y2V0eXBlKWluaXRXaXRoUGFnZTooV2ViUGFnZVByb3h5JilwYWdlIHZpZXc6KFdLVmlldyAqKXdr
VmlldworeworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisKKyAgICBpZiAoIXNlbGYpCisgICAg
ICAgIHJldHVybiBuaWw7CisKKyAgICBfcGFnZSA9ICZwYWdlOworICAgIF93a1ZpZXcgPSB3a1Zp
ZXc7CisgICAgX21lbnUgPSBhZG9wdE5TKFtbTlNNZW51IGFsbG9jXSBpbml0XSk7CisKKyAgICBf
d2tWaWV3LmFjdGlvbk1lbnUgPSBfbWVudS5nZXQoKTsKKworICAgIHJldHVybiBzZWxmOworfQor
CistICh2b2lkKXByZXBhcmVGb3JNZW51OihOU01lbnUgKiltZW51IHdpdGhFdmVudDooTlNFdmVu
dCAqKWV2ZW50Cit7CisgICAgaWYgKG1lbnUgIT0gX21lbnUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFtzZWxmIF91cGRhdGVBY3Rpb25NZW51SXRlbXNdOworCisgICAgX3BhZ2UtPnBlcmZvcm1B
Y3Rpb25NZW51SGl0VGVzdEF0TG9jYXRpb24oW193a1ZpZXcgY29udmVydFBvaW50OltldmVudCBs
b2NhdGlvbkluV2luZG93XSBmcm9tVmlldzpuaWxdKTsKKworICAgIF9zdGF0ZSA9IEFjdGlvbk1l
bnVTdGF0ZTo6UGVuZGluZzsKK30KKworLSAodm9pZCl3aWxsT3Blbk1lbnU6KE5TTWVudSAqKW1l
bnUgd2l0aEV2ZW50OihOU0V2ZW50ICopZXZlbnQKK3sKKyAgICBpZiAobWVudSAhPSBfbWVudSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKF9zdGF0ZSAhPSBBY3Rpb25NZW51U3RhdGU6
Ok5vbmUpOworCisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gYmUgYWJsZSB0byBjYW5jZWwgdGhp
cyBpZiB0aGUgbWVudSBnb2VzIGF3YXkuCisgICAgLy8gRklYTUU6IENvbm5lY3Rpb24gY2FuIGJl
IG51bGwgaWYgdGhlIHByb2Nlc3MgaXMgY2xvc2VkOyB3ZSBzaG91bGQgY2xlYW4gdXAgYmV0dGVy
IGluIHRoYXQgY2FzZS4KKyAgICBpZiAoX3N0YXRlID09IEFjdGlvbk1lbnVTdGF0ZTo6UGVuZGlu
ZykgeworICAgICAgICBpZiAoYXV0byogY29ubmVjdGlvbiA9IF9wYWdlLT5wcm9jZXNzKCkuY29u
bmVjdGlvbigpKQorICAgICAgICAgICAgY29ubmVjdGlvbi0+d2FpdEZvckFuZERpc3BhdGNoSW1t
ZWRpYXRlbHk8TWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RGlkUGVyZm9ybUFjdGlvbk1lbnVIaXRU
ZXN0PihfcGFnZS0+cGFnZUlEKCksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7Cisg
ICAgfQorCisgICAgaWYgKF9zdGF0ZSA9PSBBY3Rpb25NZW51U3RhdGU6OlJlYWR5KQorICAgICAg
ICBbc2VsZiBfdXBkYXRlQWN0aW9uTWVudUl0ZW1zXTsKK30KKworLSAodm9pZClkaWRDbG9zZU1l
bnU6KE5TTWVudSAqKW1lbnUgd2l0aEV2ZW50OihOU0V2ZW50ICopZXZlbnQKK3sKKyAgICBpZiAo
bWVudSAhPSBfbWVudSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIF9zdGF0ZSA9IEFjdGlv
bk1lbnVTdGF0ZTo6Tm9uZTsKKyAgICBfaGl0VGVzdFJlc3VsdCA9IEFjdGlvbk1lbnVIaXRUZXN0
UmVzdWx0KCk7CisgICAgX3NoYXJpbmdTZXJ2aWNlUGlja2VyID0gbmlsOworfQorCistICh2b2lk
KWRpZFBlcmZvcm1BY3Rpb25NZW51SGl0VGVzdDooY29uc3QgQWN0aW9uTWVudUhpdFRlc3RSZXN1
bHQmKWhpdFRlc3RSZXN1bHQKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBuZWVkcyB0byB1c2UgdGhl
IFdlYktpdDIgY2FsbGJhY2sgbWVjaGFuaXNtIHRvIGF2b2lkIG91dC1vZi1vcmRlciByZXBsaWVz
LgorICAgIF9zdGF0ZSA9IEFjdGlvbk1lbnVTdGF0ZTo6UmVhZHk7CisgICAgX2hpdFRlc3RSZXN1
bHQgPSBoaXRUZXN0UmVzdWx0OworfQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXS0FjdGlv
bk1lbnVDb250cm9sbGVyIChJbnRlcm5hbCkKKworI3ByYWdtYSBtYXJrIExpbmsgYWN0aW9ucwor
CistIChOU0FycmF5ICopX2RlZmF1bHRNZW51SXRlbXNGb3JMaW5rCit7CisgICAgV2ViSGl0VGVz
dFJlc3VsdCogaGl0VGVzdFJlc3VsdCA9IF9wYWdlLT5hY3RpdmVBY3Rpb25NZW51SGl0VGVzdFJl
c3VsdCgpOworICAgIGlmICghaGl0VGVzdFJlc3VsdCkKKyAgICAgICAgcmV0dXJuIEBbIF07CisK
KyAgICBpZiAoIVdlYkNvcmU6OnByb3RvY29sSXNJbkhUVFBGYW1pbHkoaGl0VGVzdFJlc3VsdC0+
YWJzb2x1dGVMaW5rVVJMKCkpKQorICAgICAgICByZXR1cm4gQFsgXTsKKworICAgIFJldGFpblB0
cjxOU01lbnVJdGVtPiBvcGVuTGlua0l0ZW0gPSBbc2VsZiBfY3JlYXRlQWN0aW9uTWVudUl0ZW1G
b3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdPcGVuTGlua0luRGVmYXVsdEJyb3dzZXJdOwor
ICAgIFJldGFpblB0cjxOU01lbnVJdGVtPiBwcmV2aWV3TGlua0l0ZW0gPSBbc2VsZiBfY3JlYXRl
QWN0aW9uTWVudUl0ZW1Gb3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdQcmV2aWV3TGlua107
CisgICAgUmV0YWluUHRyPE5TTWVudUl0ZW0+IHJlYWRpbmdMaXN0SXRlbSA9IFtzZWxmIF9jcmVh
dGVBY3Rpb25NZW51SXRlbUZvclRhZzprV0tDb250ZXh0QWN0aW9uSXRlbVRhZ0FkZExpbmtUb1Nh
ZmFyaVJlYWRpbmdMaXN0XTsKKworICAgIC8vIEZJWE1FOiBUaGUgc2VwYXJhdG9yIGl0ZW0gaXMg
cmVxdWlyZWQgdG8gd29yayBhcm91bmQgPHJkYXI6Ly8xODY4NDIwNz4uCisgICAgcmV0dXJuIEBb
b3BlbkxpbmtJdGVtLmdldCgpLCBwcmV2aWV3TGlua0l0ZW0uZ2V0KCksIFtOU01lbnVJdGVtIHNl
cGFyYXRvckl0ZW1dLCByZWFkaW5nTGlzdEl0ZW0uZ2V0KCldOworfQorCistICh2b2lkKV9vcGVu
VVJMRnJvbUFjdGlvbk1lbnU6KGlkKXNlbmRlcgoreworICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhp
dFRlc3RSZXN1bHQgPSBfcGFnZS0+YWN0aXZlQWN0aW9uTWVudUhpdFRlc3RSZXN1bHQoKTsKKyAg
ICBpZiAoIWhpdFRlc3RSZXN1bHQpCisgICAgICAgIHJldHVybjsKKworICAgIE5TVVJMICp1cmwg
PSBbTlNVUkwgVVJMV2l0aFN0cmluZzpoaXRUZXN0UmVzdWx0LT5hYnNvbHV0ZUxpbmtVUkwoKV07
CisgICAgW1tOU1dvcmtzcGFjZSBzaGFyZWRXb3Jrc3BhY2VdIG9wZW5VUkw6dXJsXTsKK30KKwor
LSAodm9pZClfYWRkVG9SZWFkaW5nTGlzdEZyb21BY3Rpb25NZW51OihpZClzZW5kZXIKK3sKKyAg
ICBXZWJIaXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0ID0gX3BhZ2UtPmFjdGl2ZUFjdGlvbk1l
bnVIaXRUZXN0UmVzdWx0KCk7CisgICAgaWYgKCFoaXRUZXN0UmVzdWx0KQorICAgICAgICByZXR1
cm47CisKKyAgICBOU1VSTCAqdXJsID0gW05TVVJMIFVSTFdpdGhTdHJpbmc6aGl0VGVzdFJlc3Vs
dC0+YWJzb2x1dGVMaW5rVVJMKCldOworICAgIE5TU2hhcmluZ1NlcnZpY2UgKnNlcnZpY2UgPSBb
TlNTaGFyaW5nU2VydmljZSBzaGFyaW5nU2VydmljZU5hbWVkOk5TU2hhcmluZ1NlcnZpY2VOYW1l
QWRkVG9TYWZhcmlSZWFkaW5nTGlzdF07CisgICAgW3NlcnZpY2UgcGVyZm9ybVdpdGhJdGVtczpA
WyB1cmwgXV07Cit9CisKKy0gKHZvaWQpX3F1aWNrTG9va1VSTEZyb21BY3Rpb25NZW51OihpZClz
ZW5kZXIKK3sKKyAgICBXZWJIaXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0ID0gX3BhZ2UtPmFj
dGl2ZUFjdGlvbk1lbnVIaXRUZXN0UmVzdWx0KCk7CisgICAgaWYgKCFoaXRUZXN0UmVzdWx0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBOU1JlY3QgaXRlbUZyYW1lID0gW193a1ZpZXcgY29udmVy
dFJlY3Q6aGl0VGVzdFJlc3VsdC0+ZWxlbWVudEJvdW5kaW5nQm94KCkgdG9WaWV3Om5pbF07Cisg
ICAgTlNTaXplIG1heGltdW1QcmV2aWV3U2l6ZSA9IE5TTWFrZVNpemUoX3drVmlldy5ib3VuZHMu
c2l6ZS53aWR0aCAqIDAuNzUsIF93a1ZpZXcuYm91bmRzLnNpemUuaGVpZ2h0ICogMC43NSk7CisK
KyAgICBSZXRhaW5QdHI8UUxQcmV2aWV3QnViYmxlPiBidWJibGUgPSBhZG9wdE5TKFtbTlNDbGFz
c0Zyb21TdHJpbmcoQCJRTFByZXZpZXdCdWJibGUiKSBhbGxvY10gaW5pdF0pOworICAgIFtidWJi
bGUgc2V0UGFyZW50V2luZG93Ol93a1ZpZXcud2luZG93XTsKKyAgICBbYnViYmxlIHNldE1heGlt
dW1TaXplOm1heGltdW1QcmV2aWV3U2l6ZV07CisgICAgW2J1YmJsZSBzZXRQcmVmZXJyZWRFZGdl
Ok5TTWF4WUVkZ2VdOworICAgIFtidWJibGUgc2V0Q29udHJvbHM6QFsgXV07CisgICAgTlNFdmVu
dE1hc2sgZmlsdGVyTWFzayA9IE5TQW55RXZlbnRNYXNrICYgfihOU0FwcEtpdERlZmluZWRNYXNr
IHwgTlNTeXN0ZW1EZWZpbmVkTWFzayB8IE5TQXBwbGljYXRpb25EZWZpbmVkTWFzayB8IE5TTW91
c2VFbnRlcmVkTWFzayB8IE5TTW91c2VFeGl0ZWRNYXNrKTsKKyAgICBOU0V2ZW50TWFzayBhdXRv
Y2xvc2VNYXNrID0gTlNMZWZ0TW91c2VEb3duTWFzayB8IE5TUmlnaHRNb3VzZURvd25NYXNrIHwg
TlNLZXlEb3duTWFzazsKKyAgICBbYnViYmxlIHNldEF1dG9tYXRpY2FsbHlDbG9zZVdpdGhNYXNr
OmF1dG9jbG9zZU1hc2sgZmlsdGVyTWFzazpmaWx0ZXJNYXNrIGJsb2NrOltidWJibGVdIHsKKyAg
ICAgICAgW2J1YmJsZSBjbG9zZV07CisgICAgfV07CisgICAgW2J1YmJsZSBzaG93UHJldmlld0l0
ZW06W05TVVJMIFVSTFdpdGhTdHJpbmc6aGl0VGVzdFJlc3VsdC0+YWJzb2x1dGVMaW5rVVJMKCld
IGl0ZW1GcmFtZTppdGVtRnJhbWVdOworfQorCisjcHJhZ21hIG1hcmsgSW1hZ2UgYWN0aW9ucwor
CistIChOU0FycmF5ICopX2RlZmF1bHRNZW51SXRlbXNGb3JJbWFnZQoreworICAgIFdlYkhpdFRl
c3RSZXN1bHQqIGhpdFRlc3RSZXN1bHQgPSBfcGFnZS0+YWN0aXZlQWN0aW9uTWVudUhpdFRlc3RS
ZXN1bHQoKTsKKyAgICBpZiAoIWhpdFRlc3RSZXN1bHQpCisgICAgICAgIHJldHVybiBAWyBdOwor
CisgICAgUmV0YWluUHRyPE5TTWVudUl0ZW0+IGNvcHlJbWFnZUl0ZW0gPSBbc2VsZiBfY3JlYXRl
QWN0aW9uTWVudUl0ZW1Gb3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdDb3B5SW1hZ2VdOwor
ICAgIFJldGFpblB0cjxOU01lbnVJdGVtPiBhZGRUb1Bob3Rvc0l0ZW0gPSBbc2VsZiBfY3JlYXRl
QWN0aW9uTWVudUl0ZW1Gb3JUYWc6a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdBZGRJbWFnZVRvUGhv
dG9zXTsKKyAgICBSZXRhaW5QdHI8TlNNZW51SXRlbT4gc2F2ZVRvRG93bmxvYWRzSXRlbSA9IFtz
ZWxmIF9jcmVhdGVBY3Rpb25NZW51SXRlbUZvclRhZzprV0tDb250ZXh0QWN0aW9uSXRlbVRhZ1Nh
dmVJbWFnZVRvRG93bmxvYWRzXTsKKyAgICBSZXRhaW5QdHI8TlNNZW51SXRlbT4gc2hhcmVJdGVt
ID0gW3NlbGYgX2NyZWF0ZUFjdGlvbk1lbnVJdGVtRm9yVGFnOmtXS0NvbnRleHRBY3Rpb25JdGVt
VGFnU2hhcmVJbWFnZV07CisKKyAgICBpZiAoUmVmUHRyPFNoYXJlYWJsZUJpdG1hcD4gYml0bWFw
ID0gX2hpdFRlc3RSZXN1bHQuaW1hZ2UpIHsKKyAgICAgICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+
IGltYWdlID0gYml0bWFwLT5tYWtlQ0dJbWFnZSgpOworICAgICAgICBSZXRhaW5QdHI8TlNJbWFn
ZT4gbnNJbWFnZSA9IGFkb3B0TlMoW1tOU0ltYWdlIGFsbG9jXSBpbml0V2l0aENHSW1hZ2U6aW1h
Z2UuZ2V0KCkgc2l6ZTpOU1plcm9TaXplXSk7CisgICAgICAgIF9zaGFyaW5nU2VydmljZVBpY2tl
ciA9IGFkb3B0TlMoW1tOU1NoYXJpbmdTZXJ2aWNlUGlja2VyIGFsbG9jXSBpbml0V2l0aEl0ZW1z
OkBbIG5zSW1hZ2UuZ2V0KCkgXV0pOworICAgICAgICBbc2hhcmVJdGVtIHNldFN1Ym1lbnU6W19z
aGFyaW5nU2VydmljZVBpY2tlciBtZW51XV07CisgICAgfQorCisgICAgcmV0dXJuIEBbY29weUlt
YWdlSXRlbS5nZXQoKSwgYWRkVG9QaG90b3NJdGVtLmdldCgpLCBzYXZlVG9Eb3dubG9hZHNJdGVt
LmdldCgpLCBzaGFyZUl0ZW0uZ2V0KCldOworfQorCistICh2b2lkKV9jb3B5SW1hZ2U6KGlkKXNl
bmRlcgoreworICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhpdFRlc3RSZXN1bHQgPSBfcGFnZS0+YWN0
aXZlQWN0aW9uTWVudUhpdFRlc3RSZXN1bHQoKTsKKyAgICBpZiAoIWhpdFRlc3RSZXN1bHQpCisg
ICAgICAgIHJldHVybjsKKworICAgIFJlZlB0cjxTaGFyZWFibGVCaXRtYXA+IGJpdG1hcCA9IF9o
aXRUZXN0UmVzdWx0LmltYWdlOworICAgIGlmICghYml0bWFwKQorICAgICAgICByZXR1cm47CisK
KyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4gaW1hZ2UgPSBiaXRtYXAtPm1ha2VDR0ltYWdlKCk7
CisgICAgUmV0YWluUHRyPE5TSW1hZ2U+IG5zSW1hZ2UgPSBhZG9wdE5TKFtbTlNJbWFnZSBhbGxv
Y10gaW5pdFdpdGhDR0ltYWdlOmltYWdlLmdldCgpIHNpemU6TlNaZXJvU2l6ZV0pOworICAgIFtb
TlNQYXN0ZWJvYXJkIGdlbmVyYWxQYXN0ZWJvYXJkXSBjbGVhckNvbnRlbnRzXTsKKyAgICBbW05T
UGFzdGVib2FyZCBnZW5lcmFsUGFzdGVib2FyZF0gd3JpdGVPYmplY3RzOkBbIG5zSW1hZ2UuZ2V0
KCkgXV07Cit9CisKKy0gKHZvaWQpX3NhdmVJbWFnZVRvRG93bmxvYWRzOihpZClzZW5kZXIKK3sK
KyAgICBXZWJIaXRUZXN0UmVzdWx0KiBoaXRUZXN0UmVzdWx0ID0gX3BhZ2UtPmFjdGl2ZUFjdGlv
bk1lbnVIaXRUZXN0UmVzdWx0KCk7CisgICAgaWYgKCFoaXRUZXN0UmVzdWx0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBfcGFnZS0+cHJvY2VzcygpLmNvbnRleHQoKS5kb3dubG9hZChfcGFnZSwg
VVJMKFVSTCgpLCBoaXRUZXN0UmVzdWx0LT5hYnNvbHV0ZUltYWdlVVJMKCkpKTsKK30KKworc3Rh
dGljIE5TU3RyaW5nICp0ZW1wb3JhcnlQaG90b3NEaXJlY3RvcnlQYXRoKCkKK3sKKyAgICBzdGF0
aWMgTlNTdHJpbmcgKnRlbXBvcmFyeVBob3Rvc0RpcmVjdG9yeVBhdGg7CisKKyAgICBpZiAoIXRl
bXBvcmFyeVBob3Rvc0RpcmVjdG9yeVBhdGgpIHsKKyAgICAgICAgTlNTdHJpbmcgKnRlbXBvcmFy
eURpcmVjdG9yeVRlbXBsYXRlID0gW05TVGVtcG9yYXJ5RGlyZWN0b3J5KCkgc3RyaW5nQnlBcHBl
bmRpbmdQYXRoQ29tcG9uZW50OkAiV2ViS2l0UGhvdG9zLVhYWFhYWCJdOworICAgICAgICBDU3Ry
aW5nIHRlbXBsYXRlUmVwcmVzZW50YXRpb24gPSBbdGVtcG9yYXJ5RGlyZWN0b3J5VGVtcGxhdGUg
ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXTsKKworICAgICAgICBpZiAobWtkdGVtcCh0ZW1wbGF0
ZVJlcHJlc2VudGF0aW9uLm11dGFibGVEYXRhKCkpKQorICAgICAgICAgICAgdGVtcG9yYXJ5UGhv
dG9zRGlyZWN0b3J5UGF0aCA9IFtbW05TRmlsZU1hbmFnZXIgZGVmYXVsdE1hbmFnZXJdIHN0cmlu
Z1dpdGhGaWxlU3lzdGVtUmVwcmVzZW50YXRpb246dGVtcGxhdGVSZXByZXNlbnRhdGlvbi5kYXRh
KCkgbGVuZ3RoOnRlbXBsYXRlUmVwcmVzZW50YXRpb24ubGVuZ3RoKCldIGNvcHldOworICAgIH0K
KworICAgIHJldHVybiB0ZW1wb3JhcnlQaG90b3NEaXJlY3RvcnlQYXRoOworfQorCitzdGF0aWMg
TlNTdHJpbmcgKnBhdGhUb1Bob3RvT25EaXNrKE5TU3RyaW5nICpzdWdnZXN0ZWRGaWxlbmFtZSkK
K3sKKyAgICBOU1N0cmluZyAqcGhvdG9EaXJlY3RvcnlQYXRoID0gdGVtcG9yYXJ5UGhvdG9zRGly
ZWN0b3J5UGF0aCgpOworICAgIGlmICghcGhvdG9EaXJlY3RvcnlQYXRoKSB7CisgICAgICAgIFdU
RkxvZ0Fsd2F5cygiQ2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgcGhvdG8gZG93bmxvYWQgZGlyZWN0
b3J5LiIpOworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKworICAgIE5TU3RyaW5nICpwYXRo
ID0gW3Bob3RvRGlyZWN0b3J5UGF0aCBzdHJpbmdCeUFwcGVuZGluZ1BhdGhDb21wb25lbnQ6c3Vn
Z2VzdGVkRmlsZW5hbWVdOworCisgICAgTlNGaWxlTWFuYWdlciAqZmlsZU1hbmFnZXIgPSBbTlNG
aWxlTWFuYWdlciBkZWZhdWx0TWFuYWdlcl07CisgICAgaWYgKFtmaWxlTWFuYWdlciBmaWxlRXhp
c3RzQXRQYXRoOnBhdGhdKSB7CisgICAgICAgIE5TU3RyaW5nICpwYXRoVGVtcGxhdGVQcmVmaXgg
PSBbcGhvdG9EaXJlY3RvcnlQYXRoIHN0cmluZ0J5QXBwZW5kaW5nUGF0aENvbXBvbmVudDpAIlhY
WFhYWC0iXTsKKyAgICAgICAgTlNTdHJpbmcgKnBhdGhUZW1wbGF0ZSA9IFtwYXRoVGVtcGxhdGVQ
cmVmaXggc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6c3VnZ2VzdGVkRmlsZW5hbWVdOworICAgICAg
ICBDU3RyaW5nIHBhdGhUZW1wbGF0ZVJlcHJlc2VudGF0aW9uID0gW3BhdGhUZW1wbGF0ZSBmaWxl
U3lzdGVtUmVwcmVzZW50YXRpb25dOworCisgICAgICAgIGludCBmZCA9IG1rc3RlbXBzKHBhdGhU
ZW1wbGF0ZVJlcHJlc2VudGF0aW9uLm11dGFibGVEYXRhKCksIHBhdGhUZW1wbGF0ZVJlcHJlc2Vu
dGF0aW9uLmxlbmd0aCgpIC0gc3RybGVuKFtwYXRoVGVtcGxhdGVQcmVmaXggZmlsZVN5c3RlbVJl
cHJlc2VudGF0aW9uXSkgKyAxKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAg
V1RGTG9nQWx3YXlzKCJDYW5ub3QgY3JlYXRlIHBob3RvIGZpbGUgaW4gdGhlIHRlbXBvcmFyeSBk
aXJlY3RvcnkgKCVAKS4iLCBzdWdnZXN0ZWRGaWxlbmFtZSk7CisgICAgICAgICAgICByZXR1cm4g
bmlsOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBwYXRoID0gW2Zp
bGVNYW5hZ2VyIHN0cmluZ1dpdGhGaWxlU3lzdGVtUmVwcmVzZW50YXRpb246cGF0aFRlbXBsYXRl
UmVwcmVzZW50YXRpb24uZGF0YSgpIGxlbmd0aDpwYXRoVGVtcGxhdGVSZXByZXNlbnRhdGlvbi5s
ZW5ndGgoKV07CisgICAgfQorCisgICAgcmV0dXJuIHBhdGg7Cit9CisKKy0gKHZvaWQpX2FkZElt
YWdlVG9QaG90b3M6KGlkKXNlbmRlcgoreworICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgZXZl
biBhZGQgdGhlIGJ1dHRvbiBpZiB0aGlzIGlzIHRoZSBjYXNlLCBmb3Igbm93LgorICAgIGlmICgh
W2dldElLU2xpZGVzaG93Q2xhc3MoKSBjYW5FeHBvcnRUb0FwcGxpY2F0aW9uOihAImNvbS5hcHBs
ZS5QaG90b3MiKV0pCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkhpdFRlc3RSZXN1bHQqIGhp
dFRlc3RSZXN1bHQgPSBfcGFnZS0+YWN0aXZlQWN0aW9uTWVudUhpdFRlc3RSZXN1bHQoKTsKKyAg
ICBpZiAoIWhpdFRlc3RSZXN1bHQpCisgICAgICAgIHJldHVybjsKKworICAgIFJlZlB0cjxTaGFy
ZWFibGVCaXRtYXA+IGJpdG1hcCA9IF9oaXRUZXN0UmVzdWx0LmltYWdlOworICAgIGlmICghYml0
bWFwKQorICAgICAgICByZXR1cm47CisgICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGltYWdlID0g
Yml0bWFwLT5tYWtlQ0dJbWFnZSgpOworCisgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0
X2dsb2JhbF9xdWV1ZShESVNQQVRDSF9RVUVVRV9QUklPUklUWV9ERUZBVUxULCAwKSwgXnsKKyAg
ICAgICAgTlNTdHJpbmcgKiBjb25zdCBzdWdnZXN0ZWRGaWxlbmFtZSA9IEAiaW1hZ2UuanBnIjsK
KworICAgICAgICBOU1N0cmluZyAqZmlsZVBhdGggPSBwYXRoVG9QaG90b09uRGlzayhzdWdnZXN0
ZWRGaWxlbmFtZSk7CisgICAgICAgIGlmICghZmlsZVBhdGgpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgTlNVUkwgKmZpbGVVUkwgPSBbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOmZpbGVQ
YXRoXTsKKyAgICAgICAgYXV0byBkZXN0ID0gYWRvcHRDRihDR0ltYWdlRGVzdGluYXRpb25DcmVh
dGVXaXRoVVJMKChDRlVSTFJlZilmaWxlVVJMLCBrVVRUeXBlSlBFRywgMSwgbnVsbHB0cikpOwor
ICAgICAgICBDR0ltYWdlRGVzdGluYXRpb25BZGRJbWFnZShkZXN0LmdldCgpLCBpbWFnZS5nZXQo
KSwgbnVsbHB0cik7CisgICAgICAgIENHSW1hZ2VEZXN0aW5hdGlvbkZpbmFsaXplKGRlc3QuZ2V0
KCkpOworCisgICAgICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCks
IF57CisgICAgICAgICAgICAvLyBUaGlzIEFQSSBwcm92aWRlcyBubyB3YXkgdG8gcmVwb3J0IGZh
aWx1cmUsIGJ1dCBpZiAxODQyMDc3OCBpcyBmaXhlZCBzbyB0aGF0IGl0IGRvZXMsIHdlIHNob3Vs
ZCBoYW5kbGUgdGhpcy4KKyAgICAgICAgICAgIFtnZXRJS1NsaWRlc2hvd0NsYXNzKCkgZXhwb3J0
U2xpZGVzaG93SXRlbTpmaWxlUGF0aCB0b0FwcGxpY2F0aW9uOihAImNvbS5hcHBsZS5QaG90b3Mi
KV07CisgICAgICAgIH0pOworICAgIH0pOworfQorCisjcHJhZ21hIG1hcmsgTWVudSBJdGVtcwor
CistIChSZXRhaW5QdHI8TlNNZW51SXRlbT4pX2NyZWF0ZUFjdGlvbk1lbnVJdGVtRm9yVGFnOih1
aW50MzJfdCl0YWcKK3sKKyAgICBTRUwgc2VsZWN0b3IgPSBuaWw7CisgICAgTlNTdHJpbmcgKnRp
dGxlID0gbmlsOworICAgIE5TSW1hZ2UgKmltYWdlID0gbmlsOworCisgICAgLy8gRklYTUU6IFRo
ZXNlIHRpdGxlcyBuZWVkIHRvIGJlIGxvY2FsaXplZC4KKyAgICBzd2l0Y2ggKHRhZykgeworICAg
IGNhc2Uga1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdPcGVuTGlua0luRGVmYXVsdEJyb3dzZXI6Cisg
ICAgICAgIHNlbGVjdG9yID0gQHNlbGVjdG9yKF9vcGVuVVJMRnJvbUFjdGlvbk1lbnU6KTsKKyAg
ICAgICAgdGl0bGUgPSBAIk9wZW4iOworICAgICAgICBpbWFnZSA9IHdlYktpdEJ1bmRsZUltYWdl
TmFtZWQoQCJPcGVuSW5OZXdXaW5kb3dUZW1wbGF0ZSIpOworICAgICAgICBicmVhazsKKworICAg
IGNhc2Uga1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdQcmV2aWV3TGluazoKKyAgICAgICAgc2VsZWN0
b3IgPSBAc2VsZWN0b3IoX3F1aWNrTG9va1VSTEZyb21BY3Rpb25NZW51Oik7CisgICAgICAgIHRp
dGxlID0gQCJQcmV2aWV3IjsKKyAgICAgICAgaW1hZ2UgPSBbTlNJbWFnZSBpbWFnZU5hbWVkOk5T
SW1hZ2VOYW1lUXVpY2tMb29rVGVtcGxhdGVdOworICAgICAgICBicmVhazsKKworICAgIGNhc2Ug
a1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdBZGRMaW5rVG9TYWZhcmlSZWFkaW5nTGlzdDoKKyAgICAg
ICAgc2VsZWN0b3IgPSBAc2VsZWN0b3IoX2FkZFRvUmVhZGluZ0xpc3RGcm9tQWN0aW9uTWVudTop
OworICAgICAgICB0aXRsZSA9IEAiQWRkIHRvIFNhZmFyaSBSZWFkaW5nIExpc3QiOworICAgICAg
ICBpbWFnZSA9IFtOU0ltYWdlIGltYWdlTmFtZWQ6TlNJbWFnZU5hbWVCb29rbWFya3NUZW1wbGF0
ZV07CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBrV0tDb250ZXh0QWN0aW9uSXRlbVRhZ0Nv
cHlJbWFnZToKKyAgICAgICAgc2VsZWN0b3IgPSBAc2VsZWN0b3IoX2NvcHlJbWFnZTopOworICAg
ICAgICB0aXRsZSA9IEAiQ29weSI7CisgICAgICAgIGltYWdlID0gd2ViS2l0QnVuZGxlSW1hZ2VO
YW1lZChAIkNvcHlJbWFnZVRlbXBsYXRlIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBr
V0tDb250ZXh0QWN0aW9uSXRlbVRhZ0FkZEltYWdlVG9QaG90b3M6CisgICAgICAgIHNlbGVjdG9y
ID0gQHNlbGVjdG9yKF9hZGRJbWFnZVRvUGhvdG9zOik7CisgICAgICAgIHRpdGxlID0gQCJBZGQg
dG8gUGhvdG9zIjsKKyAgICAgICAgaW1hZ2UgPSB3ZWJLaXRCdW5kbGVJbWFnZU5hbWVkKEAiQWRk
SW1hZ2VUb1Bob3Rvc1RlbXBsYXRlIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBrV0tD
b250ZXh0QWN0aW9uSXRlbVRhZ1NhdmVJbWFnZVRvRG93bmxvYWRzOgorICAgICAgICBzZWxlY3Rv
ciA9IEBzZWxlY3Rvcihfc2F2ZUltYWdlVG9Eb3dubG9hZHM6KTsKKyAgICAgICAgdGl0bGUgPSBA
IlNhdmUgdG8gRG93bmxvYWRzIjsKKyAgICAgICAgaW1hZ2UgPSB3ZWJLaXRCdW5kbGVJbWFnZU5h
bWVkKEAiU2F2ZUltYWdlVG9Eb3dubG9hZHNUZW1wbGF0ZSIpOworICAgICAgICBicmVhazsKKwor
ICAgIGNhc2Uga1dLQ29udGV4dEFjdGlvbkl0ZW1UYWdTaGFyZUltYWdlOgorICAgICAgICB0aXRs
ZSA9IEAiU2hhcmUiOworICAgICAgICBpbWFnZSA9IHdlYktpdEJ1bmRsZUltYWdlTmFtZWQoQCJT
aGFyZUltYWdlVGVtcGxhdGUiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisK
KyAgICBSZXRhaW5QdHI8TlNNZW51SXRlbT4gaXRlbSA9IGFkb3B0TlMoW1tOU01lbnVJdGVtIGFs
bG9jXSBpbml0V2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpzZWxlY3RvciBrZXlFcXVpdmFsZW50OkAi
Il0pOworICAgIFtpdGVtIHNldEltYWdlOmltYWdlXTsKKyAgICBbaXRlbSBzZXRUYXJnZXQ6c2Vs
Zl07CisgICAgW2l0ZW0gc2V0VGFnOnRhZ107CisgICAgcmV0dXJuIGl0ZW07Cit9CisKK3N0YXRp
YyBOU0ltYWdlICp3ZWJLaXRCdW5kbGVJbWFnZU5hbWVkKE5TU3RyaW5nICpuYW1lKQoreworICAg
IHJldHVybiBbW05TQnVuZGxlIGJ1bmRsZUZvckNsYXNzOltXS1ZpZXcgY2xhc3NdXSBpbWFnZUZv
clJlc291cmNlOm5hbWVdOworfQorCistIChOU0FycmF5ICopX2RlZmF1bHRNZW51SXRlbXMKK3sK
KyAgICBpZiAoV2ViSGl0VGVzdFJlc3VsdCogaGl0VGVzdFJlc3VsdCA9IF9wYWdlLT5hY3RpdmVB
Y3Rpb25NZW51SGl0VGVzdFJlc3VsdCgpKSB7CisgICAgICAgIGlmICghaGl0VGVzdFJlc3VsdC0+
YWJzb2x1dGVJbWFnZVVSTCgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBbc2VsZiBf
ZGVmYXVsdE1lbnVJdGVtc0ZvckltYWdlXTsKKyAgICAgICAgaWYgKCFoaXRUZXN0UmVzdWx0LT5h
YnNvbHV0ZUxpbmtVUkwoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gW3NlbGYgX2Rl
ZmF1bHRNZW51SXRlbXNGb3JMaW5rXTsKKyAgICB9CisKKyAgICByZXR1cm4gQFsgXTsKK30KKwor
LSAodm9pZClfdXBkYXRlQWN0aW9uTWVudUl0ZW1zCit7CisgICAgW19tZW51IHJlbW92ZUFsbEl0
ZW1zXTsKKworICAgIE5TQXJyYXkgKm1lbnVJdGVtcyA9IFtfd2tWaWV3IF9hY3Rpb25NZW51SXRl
bXNGb3JIaXRUZXN0UmVzdWx0OnRvQVBJKF9wYWdlLT5hY3RpdmVBY3Rpb25NZW51SGl0VGVzdFJl
c3VsdCgpKSBkZWZhdWx0QWN0aW9uTWVudUl0ZW1zOltzZWxmIF9kZWZhdWx0TWVudUl0ZW1zXV07
CisgICAgCisgICAgZm9yIChOU01lbnVJdGVtICppdGVtIGluIG1lbnVJdGVtcykKKyAgICAgICAg
W19tZW51IGFkZEl0ZW06aXRlbV07Cit9CisKK0BlbmQKKworI2VuZGlmIC8vIFBMQVRGT1JNKE1B
QykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvaiBiL1NvdXJjZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agppbmRleCA5Y2U5M2U5Y2YwMWJmOGFiNDcyYzk4N2ZkYTk4Zjk5OWVjZGFiYjg4Li5hNmI2NDll
MzE3Y2QzODY3NzRlMmU5MGQ0NDM0NzhmZTRjNDViMTlhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
S2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYktp
dDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC01NjQsNiArNTY0LDggQEAK
IAkJMjlDRDU1QUIxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmpl
Y3RCYXNlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MjlDRDU1QTkxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RC
YXNlLm1tICovOyB9OwogCQkyOUQ1NURGMTE2MUJGOUYxMDAzMUEyRTMgLyogV2ViUGFnZUdyb3Vw
UHJveHlNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMjlENTVERUYxNjFCRjlGMTAwMzFBMkUzIC8qIFdlYlBhZ2VHcm91cFBy
b3h5TWVzc2FnZVJlY2VpdmVyLmNwcCAqLzsgfTsKIAkJMjlENTVERjIxNjFCRjlGMTAwMzFBMkUz
IC8qIFdlYlBhZ2VHcm91cFByb3h5TWVzc2FnZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI5RDU1REYwMTYxQkY5RjEwMDMxQTJFMyAvKiBXZWJQYWdl
R3JvdXBQcm94eU1lc3NhZ2VzLmggKi87IH07CisJCTJEMDczMEEyMTlGOUM3REEwMEU5RDlDNCAv
KiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMkQwNzMwQTAxOUY5QzdEQTAwRTlEOUM0IC8qIFdLQWN0aW9uTWVu
dUNvbnRyb2xsZXIubW0gKi87IH07CisJCTJEMDczMEEzMTlGOUM3REEwMEU5RDlDNCAvKiBXS0Fj
dGlvbk1lbnVDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyRDA3MzBBMTE5RjlDN0RBMDBFOUQ5QzQgLyogV0tBY3Rpb25NZW51Q29udHJv
bGxlci5oICovOyB9OwogCQkyRDEyNUM1RTE4NTdFQTA1MDAzQkEzQ0IgLyogVmlld0dlc3R1cmVD
b250cm9sbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAyRDEyNUM1QzE4NTdFQTA1MDAzQkEzQ0IgLyogVmlld0dlc3R1cmVDb250cm9sbGVyLmggKi87
IH07CiAJCTJEMTI1QzVGMTg1N0VBMDUwMDNCQTNDQiAvKiBWaWV3R2VzdHVyZUNvbnRyb2xsZXJN
YWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRDEy
NUM1RDE4NTdFQTA1MDAzQkEzQ0IgLyogVmlld0dlc3R1cmVDb250cm9sbGVyTWFjLm1tICovOyB9
OwogCQkyRDFCNUQ1RDE4NTg2OUM4MDA2QzY1OTYgLyogVmlld0dlc3R1cmVDb250cm9sbGVyTWVz
c2FnZVJlY2VpdmVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDJEMUI1RDVCMTg1ODY5QzgwMDZDNjU5NiAvKiBWaWV3R2VzdHVyZUNvbnRyb2xsZXJN
ZXNzYWdlUmVjZWl2ZXIuY3BwICovOyB9OwpAQCAtMjU2MCw2ICsyNTYyLDggQEAKIAkJMjlENTVE
RUUxNjFCRjg3ODAwMzFBMkUzIC8qIFdlYlBhZ2VHcm91cFByb3h5Lm1lc3NhZ2VzLmluICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9
IFdlYlBhZ2VHcm91cFByb3h5Lm1lc3NhZ2VzLmluOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkyOUQ1NURFRjE2MUJGOUYxMDAzMUEyRTMgLyogV2ViUGFnZUdyb3VwUHJveHlNZXNzYWdl
UmVjZWl2ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV2ViUGFn
ZUdyb3VwUHJveHlNZXNzYWdlUmVjZWl2ZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkyOUQ1NURGMDE2MUJGOUYxMDAzMUEyRTMgLyogV2ViUGFnZUdyb3VwUHJveHlNZXNzYWdl
cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJQYWdlR3JvdXBQcm94eU1l
c3NhZ2VzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTJEMDczMEEwMTlGOUM3REEw
MEU5RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLm1tICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAub2JqY3BwOyBwYXRoID0gV0tBY3Rpb25NZW51Q29udHJvbGxlci5tbTsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMkQwNzMwQTExOUY5QzdEQTAwRTlEOUM0IC8qIFdLQWN0aW9u
TWVudUNvbnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV0tBY3Rp
b25NZW51Q29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRDEyNUM1
QzE4NTdFQTA1MDAzQkEzQ0IgLyogVmlld0dlc3R1cmVDb250cm9sbGVyLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFZpZXdHZXN0dXJlQ29udHJvbGxlci5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkyRDEyNUM1RDE4NTdFQTA1MDAzQkEzQ0IgLyogVmlld0dlc3R1
cmVDb250cm9sbGVyTWFjLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRo
ID0gVmlld0dlc3R1cmVDb250cm9sbGVyTWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkyRDFCNUQ1QTE4NTg2NTk5MDA2QzY1OTYgLyogVmlld0dlc3R1cmVDb250cm9sbGVyLm1l
c3NhZ2VzLmluICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBl
ID0gdGV4dDsgcGF0aCA9IFZpZXdHZXN0dXJlQ29udHJvbGxlci5tZXNzYWdlcy5pbjsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTY2MjcsNiArNjYzMSw4IEBACiAJCQkJNTFEMTMwNTcx
MzgyRjEwNTAwMzUxRUREIC8qIFdlYlByb2Nlc3NQcm94eU1hYy5tbSAqLywKIAkJCQk4NjgxNjBD
RDE4NzYzRDRCMDAyMUU3OUQgLyogV2luZG93U2VydmVyQ29ubmVjdGlvbi5oICovLAogCQkJCTg2
ODE2MENGMTg3NjQ1MzcwMDIxRTc5RCAvKiBXaW5kb3dTZXJ2ZXJDb25uZWN0aW9uLm1tICovLAor
CQkJCTJEMDczMEEwMTlGOUM3REEwMEU5RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLm1t
ICovLAorCQkJCTJEMDczMEExMTlGOUM3REEwMEU5RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9s
bGVyLmggKi8sCiAJCQkJRTFBRUEyMkQxNDY4N0JEQjAwODA0NTY5IC8qIFdLRnVsbEtleWJvYXJk
QWNjZXNzV2F0Y2hlci5oICovLAogCQkJCUUxQUVBMjJFMTQ2ODdCREIwMDgwNDU2OSAvKiBXS0Z1
bGxLZXlib2FyZEFjY2Vzc1dhdGNoZXIubW0gKi8sCiAJCQkJQ0RDQTg1QzcxMzJBQkE0RTAwRTk2
MURGIC8qIFdLRnVsbFNjcmVlbldpbmRvd0NvbnRyb2xsZXIuaCAqLywKQEAgLTcwNzcsNiArNzA4
Myw3IEBACiAJCQkJRTE1MTNDNjcxNjZFQUJCMjAwMTQ5RkNCIC8qIENoaWxkUHJvY2Vzc1Byb3h5
LmggaW4gSGVhZGVycyAqLywKIAkJCQk3Q0EyNTRFQjE4Mjk5M0NFMDBGQzhBNDEgLyogV0tCcm93
c2luZ0NvbnRleHRQb2xpY3lEZWxlZ2F0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMzdDNEMwODcx
ODE0OUM1QjAwMzY4OEI5IC8qIFdLQmFja0ZvcndhcmRMaXN0SXRlbS5oIGluIEhlYWRlcnMgKi8s
CisJCQkJMkQwNzMwQTMxOUY5QzdEQTAwRTlEOUM0IC8qIFdLQWN0aW9uTWVudUNvbnRyb2xsZXIu
aCBpbiBIZWFkZXJzICovLAogCQkJCTFGMzM1QkMwMTg1Qjg0RjAwMDFBMjAxQSAvKiBXS1dlYlBy
b2Nlc3NQbHVnSW5Mb2FkRGVsZWdhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTFGNzUwNkI0MTg1
OTE2NEMwMEVDMEZGNyAvKiBXS1dlYlByb2Nlc3NQbHVnSW5TY3JpcHRXb3JsZC5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMUE0M0U4MkExODhGM0NEQzAwOUU0RDMwIC8qIF9XS1Byb2Nlc3NQb29sQ29u
ZmlndXJhdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC05MDgxLDYgKzkwODgsNyBAQAogCQkJCTUx
OEQyQ0FEMTJENTE1M0IwMDNCQjkzQiAvKiBXZWJCYWNrRm9yd2FyZExpc3RJdGVtLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUJDNzJCOUZBMTFFNjQ3NkIwMDFFQjRFQSAvKiBXZWJCYWNrRm9yd2Fy
ZExpc3RQcm94eS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzExMUE1QTExMkY0RkJCMDAzMzdC
QUIgLyogV2ViQ2hyb21lQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTJEMDczMEEyMTlG
OUM3REEwMEU5RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLm1tIGluIFNvdXJjZXMgKi8s
CiAJCQkJODY4MTYwRDAxODc2NDU1NzAwMjFFNzlEIC8qIFdpbmRvd1NlcnZlckNvbm5lY3Rpb24u
bW0gaW4gU291cmNlcyAqLywKIAkJCQkzRjg3QjlCRDE1ODk0MDEyMDA5MEZGNjIgLyogV2ViQ29s
b3JDaG9vc2VyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE1OEI2RjA5MThGQ0E3MzMwMDhDQkE1
MyAvKiBXS0ZpbGVVcGxvYWRQYW5lbC5tbSBpbiBTb3VyY2VzICovLAo=
</data>
<flag name="review"
          id="265169"
          type_id="1"
          status="+"
          setter="mitz"
    />
          </attachment>
      

    </bug>

</bugzilla>