<?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>53197</bug_id>
          
          <creation_ts>2011-01-26 15:22:30 -0800</creation_ts>
          <short_desc>Make WebKit2 printing asynchronous</short_desc>
          <delta_ts>2011-01-27 11:38:37 -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>Printing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>andersca</cc>
    
    <cc>buildbot</cc>
    
    <cc>mitz</cc>
    
    <cc>sam</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>340515</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-26 15:22:30 -0800</bug_when>
    <thetext>Print preview still blocks the UI process, even with WebKit2. It shouldn&apos;t.

&lt;rdar://problem/8895682&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340538</commentid>
    <comment_count>1</comment_count>
      <attachid>80250</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-26 15:57:51 -0800</bug_when>
    <thetext>Created attachment 80250
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340540</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-26 15:58:09 -0800</bug_when>
    <thetext>This will temporarily break window.print().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340569</commentid>
    <comment_count>3</comment_count>
      <attachid>80250</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-26 16:29:49 -0800</bug_when>
    <thetext>Comment on attachment 80250
proposed patch

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

There is some really fragile stuff here, with various assumptions about AppKit. I wonder what we can do to reduce the assumptions and tighten it up.

&gt; Source/WebKit2/UIProcess/GenericCallback.h:121
&gt; +        RefPtr&lt;WebError&gt; error = WebError::create();
&gt; +        m_callback(Vector&lt;WebCore::IntRect&gt;(), 0, toAPI(error.get()), m_context);

I don’t think you need a local variable for “error”.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:2197
&gt; +        // FIXME: Log error or assert.

I think we probably want to taint the web process here rather than logging an error or asserting. The same thing we do with bad frame IDs, for example. Or maybe I have this backwards.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:-39
&gt; -    Vector&lt;WebCore::IntRect&gt; _webPrintingPageRects;
&gt; -    double _webTotalScaleFactorForPrinting;

Were the “web” prefixes here an attempt to avoid conflicting with AppKit field names? The rules about who gets to use underscore-prefixed identifiers are unclear! Maybe we shouldn’t use underscores at all since this is a private class and the issue is conflict with AppKit, not with framework clients.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:42
&gt; +    HashMap&lt;WebCore::IntRect, Vector&lt;uint8_t&gt; &gt; _pagePreviews;

A typedef for this HashMap could make the code below easier to read.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:48
&gt; +    HashMap&lt;uint64_t, WebCore::IntRect&gt; _expectedPreviewCallbacks;

Ditto.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:132
&gt; +static void pageDidDrawToPDF(WKDataRef dataRef, WKErrorRef, void* ctx)

There must be a better name than ctx. I think I used the name untypedContext somewhere for this.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:156
&gt; +            (*entry.first).second.append(data-&gt;bytes(), data-&gt;size());

You can use an arrow here instead of (*x). and I think it’s easier to read.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:187
&gt; +    if (lastPage &gt; _printingPageRects.size()) // Last page is NSIntegerMax if not set by the user.

NSIntegerMax won’t fit in an unsigned. I guess we get the max unsigned?

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:195
&gt; +    RefPtr&lt;DataCallback&gt; cb = DataCallback::create(context, pageDidDrawToPDF);

How about splurging on a few extra letters and calling this callback instead of cb?

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:204
&gt; +static void pageDidComputePageRects(const Vector&lt;WebCore::IntRect&gt;&amp; pageRects, double totalScaleFactorForPrinting, WKErrorRef, void* ctx)

Still not a fan of ctx.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:208
&gt; +    IPCCallbackContext* context = static_cast&lt;IPCCallbackContext*&gt;(ctx);

Other people have been using OwnPtr and adoptPtr instead of delete. This allows you to do things like early returns if you like.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:244
&gt; +    IPCCallbackContext* context = new IPCCallbackContext;

Maybe it’s a bit stilted, but I like the idea of using OwnPtr and leakPtr instead of raw pointers.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:245
&gt; +    RefPtr&lt;ComputedPagesCallback&gt; cb = ComputedPagesCallback::create(context, pageDidComputePageRects);

Again, I prefer the full word name, callback.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:250
&gt; +    _webFrame-&gt;page()-&gt;computePagesForPrinting(_webFrame.get(), PrintInfo([_printOperation printInfo]), cb.get());

Should be release, not get, here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340577</commentid>
    <comment_count>4</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2011-01-26 16:37:11 -0800</bug_when>
    <thetext>Attachment 80250 did not build on win:
Build output: http://queues.webkit.org/results/7501331</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340604</commentid>
    <comment_count>5</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-01-26 17:09:27 -0800</bug_when>
    <thetext>Attachment 80250 did not build on qt:
Build output: http://queues.webkit.org/results/7565387</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340721</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-26 22:30:32 -0800</bug_when>
    <thetext>Attachment 80250 did not build on mac:
Build output: http://queues.webkit.org/results/7614364</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340921</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-27 10:28:26 -0800</bug_when>
    <thetext>&gt; There is some really fragile stuff here, with various assumptions about AppKit. 
&gt; I wonder what we can do to reduce the assumptions and tighten it up.

Definitely agreed - hopefully, we can make it better when APIs we requested are added.

&gt; &gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:42
&gt; &gt; +    HashMap&lt;WebCore::IntRect, Vector&lt;uint8_t&gt; &gt; _pagePreviews;
&gt; 
&gt; A typedef for this HashMap could make the code below easier to read.

This is one WebKit coding style pattern that frequently annoys me. Whenever I go to a header file to look what a compound member variable is, I have to also hunt down its type&apos;s typedef.

On the other hand, while an iterator type like &quot;HashMap&lt;WebCore::IntRect, Vector&lt;uint8_t&gt; &gt;::iterator&quot; adds significant visual noise, it&apos;s not something you need to actually read and understand as long as compiler doesn&apos;t complain.

&gt; Other people have been using OwnPtr and adoptPtr instead of delete. This allows you to do things like early returns if you like.

Done, looks nice.

&gt; &gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:244
&gt; &gt; +    IPCCallbackContext* context = new IPCCallbackContext;
&gt; 
&gt; Maybe it’s a bit stilted, but I like the idea of using OwnPtr and leakPtr instead of raw pointers.

This one doesn&apos;t look so nice in this case - the context is passed to ComputedPagesCallback::create(), but then it&apos;s also changed. I would either have to call leakPtr later, or access context indirectly. Neither is beautiful.

    OwnPtr&lt;IPCCallbackContext&gt; context = adoptPtr(new IPCCallbackContext);
    RefPtr&lt;ComputedPagesCallback&gt; callback = ComputedPagesCallback::create(context.leakPtr(), pageDidComputePageRects);
    _expectedComputedPagesCallback = callback-&gt;callbackID();
    callback-&gt;context-&gt;view = self; // Why not use context here?
    callback-&gt;context-&gt;callbackID = _expectedComputedPagesCallback; // Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340972</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-27 11:38:37 -0800</bug_when>
    <thetext>Committed &lt;http://trac.webkit.org/changeset/76821&gt;. I also took out beginPrinting() change - I&apos;m no longer sure that implicitly beginning printing when drawing PDF is a good idea. Layout is time consuming, and the client knows better when something changes that requires relayout.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80250</attachid>
            <date>2011-01-26 15:57:51 -0800</date>
            <delta_ts>2011-01-26 16:29:48 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>AsyncPrinting.txt</filename>
            <type>text/plain</type>
            <size>48270</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NzI2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDEtMjYgIEFsZXhleSBQ
cm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTUzMTk3CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84ODk1NjgyPiBNYWtlIFdlYktpdDIg
cHJpbnRpbmcgYXN5bmNocm9ub3VzCisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogRXhwb3J0
IG1vcmUgUHJpbnRDb250ZXh0IG1ldGhvZHMgdGhhdCB3ZSBkaWRuJ3QgdXNlIG9uIE1hYyBiZWZv
cmUuCisKKyAgICAgICAgKiBwYWdlL1ByaW50Q29udGV4dC5jcHA6IChXZWJDb3JlOjpQcmludENv
bnRleHQ6OnNwb29sUmVjdCk6IENoYW5nZWQgdG8gbWFrZSB0aGUgc2FtZQorICAgICAgICB0cmFu
c2Zvcm1hdGlvbiBhcyBzcG9vbFBhZ2VzIGRvZXMgZm9yIGNvbnNpc3RlbmN5LgorCiAyMDExLTAx
LTI2ICBEYXZlIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IERhbiBCZXJuc3RlaW4uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkocmV2aXNpb24gNzY2NTkp
CisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkod29ya2luZyBjb3B5KQpAQCAtMTAw
MCw2ICsxMDAwLDggQEAgX19aTks3V2ViQ29yZTEyRXZlbnRIYW5kbGVyMjBjdXJyZW50S2V5Ygog
X19aTks3V2ViQ29yZTEySWNvbkRhdGFiYXNlMTJkYXRhYmFzZVBhdGhFdgogX19aTks3V2ViQ29y
ZTEySWNvbkRhdGFiYXNlMjRzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHlFdgogX19aTks3V2ViQ29y
ZTEySWNvbkRhdGFiYXNlOWlzRW5hYmxlZEV2CitfX1pOSzdXZWJDb3JlMTJQcmludENvbnRleHQ4
cGFnZVJlY3RFbQorX19aTks3V2ViQ29yZTEyUHJpbnRDb250ZXh0OXBhZ2VDb3VudEV2CiBfX1pO
SzdXZWJDb3JlMTJSZW5kZXJPYmplY3QxNGVuY2xvc2luZ0xheWVyRXYKIF9fWk5LN1dlYkNvcmUx
MlJlbmRlck9iamVjdDE1bG9jYWxUb0Fic29sdXRlRU5TXzEwRmxvYXRQb2ludEViYgogX19aTks3
V2ViQ29yZTEyUmVuZGVyT2JqZWN0N2NoaWxkQXRFagpJbmRleDogU291cmNlL1dlYkNvcmUvcGFn
ZS9QcmludENvbnRleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUHJp
bnRDb250ZXh0LmNwcAkocmV2aXNpb24gNzY2NTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL1By
aW50Q29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2NSw4ICsxNjUsNyBAQCB2b2lkIFBy
aW50Q29udGV4dDo6c3Bvb2xQYWdlKEdyYXBoaWNzQ29uCiB2b2lkIFByaW50Q29udGV4dDo6c3Bv
b2xSZWN0KEdyYXBoaWNzQ29udGV4dCYgY3R4LCBjb25zdCBJbnRSZWN0JiByZWN0KQogewogICAg
IGN0eC5zYXZlKCk7Ci0gICAgY3R4LnNjYWxlKEZsb2F0U2l6ZSgxLCAtMSkpOwotICAgIGN0eC50
cmFuc2xhdGUoMCwgLW1fZnJhbWUtPnZpZXcoKS0+Y29udGVudHNIZWlnaHQoKSk7CisgICAgY3R4
LnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSk7CiAgICAgY3R4LmNsaXAocmVjdCk7CiAg
ICAgbV9mcmFtZS0+dmlldygpLT5wYWludENvbnRlbnRzKCZjdHgsIHJlY3QpOwogICAgIGN0eC5y
ZXN0b3JlKCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiA3NjcyNikKKysrIFNvdXJjZS9XZWJL
aXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDkzIEBACisyMDExLTAxLTI2
ICBBbGV4ZXkgUHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01MzE5NworICAgICAgICA8cmRhcjovL3Byb2JsZW0vODg5NTY4Mj4gTWFr
ZSBXZWJLaXQyIHByaW50aW5nIGFzeW5jaHJvbm91cworCisgICAgICAgIDxyZGFyOi8vcHJvYmxl
bS84ODk5OTg4PiBSRUdSRVNTSU9OKFdlYktpdDIpOiBBdHRlbXB0aW5nIHRvIHByaW50IFdIQVRX
RyBIVE1MIHNwZWMgc2hvd3MKKyAgICAgICAgMS1wYWdlIGJsYW5rIHByZXZpZXcKKworICAgICAg
ICA8cmRhcjovL3Byb2JsZW0vODkwMDA3OD4gV2ViS2l0MiBwcmludGluZyBoYXMgYSBzZXBhcmF0
ZSBtZXNzYWdlIGV4Y2hhbmdlIHBlciBwYWdlIHdoZW4KKyAgICAgICAgcHJpbnRpbmcgaW5zdGVh
ZCBvZiBwcmludGluZyBhbGwgYXQgb25jZQorCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9tYWMv
V0tQcmludGluZ1ZpZXcuaDogU3RvcmUgYSBsb3QgbW9yZSBjYWNoZWQgaW5mb3JtYXRpb24uCisK
KyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5tbToKKyAgICAgICAg
KC1bV0tQcmludGluZ1ZpZXcgX2FkanVzdFByaW50aW5nTWFyZ2luc0ZvckhlYWRlckFuZEZvb3Rl
cl0pOiBVc2UgUHJpbnRPcGVyYXRpb24gc3RvcmVkIGluCisgICAgICAgIGNsYXNzLiBXZSBnZW5l
cmFsbHkgd2FudCB0aGF0IG5vdywgYmVjYXVzZSBjdXJyZW50IG9wZXJhdGlvbiB3aWxsIG5vdCBi
ZSBzZXQgdXAgb24gb3RoZXIgdGhyZWFkcy4KKyAgICAgICAgKC1bV0tQcmludGluZ1ZpZXcgX2lz
UHJpbnRpbmdQcmV2aWV3XSk6IEFkZGVkLiBQcmV2aWV3IGlzIGRpZmZlcmVudCwgYmVjYXVzZSBp
dCBjYW4gZHJhdworICAgICAgICBhIHBsYWNlaG9sZGVyIC0gYnV0IGFjdHVhbCBwcmludGluZyBu
ZWVkIHRvIHdhaXQgdW50aWwgVUkgcHJvY2VzcyBoYXMgZGF0YS4KKyAgICAgICAgKC1bV0tQcmlu
dGluZ1ZpZXcgX3VwZGF0ZVByZXZpZXddKTogRm9yY2UgQXBwS2l0IHRvIHVwZGF0ZSBwcmludCBw
cmV2aWV3IHdoZW4gd2UgaGF2ZSByZWFsCisgICAgICAgIGRhdGEgdG8gcmVwbGFjZSBwbGFjZWhv
bGRlciB3aXRoLgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBfaGFzUGFnZVJlY3RzXSk6IFJl
dHVybiBpZiBwYWdlIHJlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgICAo
LVtXS1ByaW50aW5nVmlldyBfZXhwZWN0ZWRQcmV2aWV3Q2FsbGJhY2tGb3JSZWN0Ol0pOiBGaW5k
IGFuIGV4aXN0aW5nIHJlcXVlc3QgZm9yIHRoaXMgcmVjdCwKKyAgICAgICAgaWYgYW55LgorICAg
ICAgICAocGFnZURpZERyYXdUb1BERik6IFVwZGF0ZSBwcmV2aWV3IC0gb3IgaWYgYWN0dWFsbHkg
cHJpbnRpbmcsIHJlbGVhc2UgY29udHJvbCB0byBwcmludGluZyB0aHJlYWQuCisgICAgICAgICgt
W1dLUHJpbnRpbmdWaWV3IF9wcmVwYXJlUERGRGF0YUZvclByaW50aW5nT25TZWNvbmRhcnlUaHJl
YWRdKTogQXNrIGZvciBhIFBERiBkb2N1bWVudCB3aXRoCisgICAgICAgIHBhZ2VzIHRoZSB1c2Vy
IGFza2VkIHRvIHByaW50LgorICAgICAgICAocGFnZURpZENvbXB1dGVQYWdlUmVjdHMpOiBXaGVu
IHdlYiBwcm9jZXNzIHJldHVybnMgcGFnZSBnZW9tZXRyeSBkYXRhLCB3ZSB1cGRhdGUgcHJldmll
dyB0byBkaXNwbGF5CisgICAgICAgIGEgcGFnZSBjb3VudCAod2hpY2ggaW5kaXJlY3RseSB0cmln
Z2VycyBhIHJlcXVlc3QgZm9yIGEgcHJldmlldykuIFdoZW4gYWN0dWFsbHkgcHJpbnRpbmcsCisg
ICAgICAgIHJlcXVlc3QgYSBQREYgcmlnaHQgYXdheSwgd2UnbGwgbmVlZCBpdCBsYXRlci4KKyAg
ICAgICAgKC1bV0tQcmludGluZ1ZpZXcgX2Fza1BhZ2VUb0NvbXB1dGVQYWdlUmVjdHNdKTogQXNr
IHdlYiBwcm9jZXNzIGZvciBwYWdlIGdlb21ldHJ5LgorICAgICAgICAocHJlcGFyZURhdGFGb3JQ
cmludGluZ09uU2Vjb25kYXJ5VGhyZWFkKTogVGhpcyBmdW5jdGlvbiBzdGFydHMgcHJlcGFyaW5n
IGFsbCBkYXRhIG5lY2Vzc2FyeQorICAgICAgICBmb3IgYWN0dWFsIHByaW50aW5nIG9uIG1haW4g
dGhyZWFkLgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBrbm93c1BhZ2VSYW5nZTpdKTogQ2hh
bmdlZCB0byBiZSBhc3luYyBmb3IgcHJldmlldywgYW5kIHRvIGNhbGwgbWFpbgorICAgICAgICB0
aHJlYWQgZm9yIGFjdHVhbCBwcmludGluZy4KKyAgICAgICAgKC1bV0tQcmludGluZ1ZpZXcgX3Bh
Z2VGb3JSZWN0Ol0pOiBGaW5kIHBhZ2UgbnVtYmVyIGZvciBhIGdpdmVuIHJhbmdlLCBhc3N1bWlu
ZyB0aGF0IEFwcEtpdAorICAgICAgICBhbHdheXMgYXNrcyBmb3IgZnVsbCBwYWdlcy4KKyAgICAg
ICAgKC1bV0tQcmludGluZ1ZpZXcgX2RyYXdQREZEb2N1bWVudDpwYWdlOmF0UG9pbnQ6XSk6IEEg
aGVscGVyIGZ1bmN0aW9uIHRvIGRyYXcgYSBQREYgZG9jdW1lbnQuCisgICAgICAgICgtW1dLUHJp
bnRpbmdWaWV3IF9kcmF3UHJldmlldzpdKTogRHJhdyB0aGUgd2hvbGUgcGFnZSBmb3IgcHJldmll
dy4KKyAgICAgICAgKC1bV0tQcmludGluZ1ZpZXcgX3JlY3Vyc2l2ZURpc3BsYXlSZWN0SWZOZWVk
ZWRJZ25vcmluZ09wYWNpdHk6aXNWaXNpYmxlUmVjdDpyZWN0SXNWaXNpYmxlUmVjdEZvclZpZXc6
dG9wVmlldzpdKToKKyAgICAgICAgRHJhdyB0aGUgd2hvbGUgcGFnZSBmb3IgYWN0dWFsIHByaW50
aW5nLgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBfZHJhd1BhZ2VCb3JkZXJXaXRoU2l6ZU9u
TWFpblRocmVhZDpdKTogQ2FsbCBkcmF3UGFnZUJvcmRlcldpdGhTaXplOiB3aXRoCisgICAgICAg
IGNvcnJlY3QgZ3JhcGhpY3MgY29udGV4dCBhbmQgcHJpbnQgb3BlcmF0aW9uLgorICAgICAgICAo
LVtXS1ByaW50aW5nVmlldyBkcmF3UGFnZUJvcmRlcldpdGhTaXplOl0pOiBEZWxlZ2F0ZSB3b3Jr
IHRvIG1haW4gdGhyZWFkIHdoZW4gY2FsbGVkIGZyb20gYQorICAgICAgICBzZWNvbmRhcnkgb25l
LgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBfcHJvdmlkZVRvdGFsU2NhbGVGYWN0b3JGb3JQ
cmludE9wZXJhdGlvbjpdKTogQWRkZWQgYW4gYXNzZXJ0aW9uIHRoYXQKKyAgICAgICAgb3VyIHN0
b3JlZCBOU1ByaW50T3BlcmF0aW9uIGlzbid0IG91dCBvZiBzeW5jIHdpdGggcmVhbGl0eS4KKyAg
ICAgICAgKC1bV0tQcmludGluZ1ZpZXcgcmVjdEZvclBhZ2U6XSk6IEhhbmRsZSB0aGUgY2FzZSB3
aGVyZSB3ZSBkb24ndCBoYXZlIHRoZSBkYXQgeWV0LCBkcmF3aW5nCisgICAgICAgIGEgcGxhY2Vo
b2xkZXIuCisgICAgICAgICgtW1dLUHJpbnRpbmdWaWV3IGVuZERvY3VtZW50XSk6IFdoZW4gcGFn
ZSBzZXR1cCBjaGFuZ2VzLCB3ZSBtdXN0IHJlc2V0IGFsbCBzdGF0ZS4KKworICAgICAgICAqIFVJ
UHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbTogKC1bV0tWaWV3IHByaW50T3BlcmF0aW9uV2l0aFBy
aW50SW5mbzpmb3JGcmFtZTpdKTogVGVsbAorICAgICAgICBOU1ByaW50aW5nVmlldyB3aGljaCBv
cGVyYXRpb24gaXQncyBzZXJ2aW5nLCBzbyB0aGF0IGl0IGtub3dzIGl0IGV2ZW4gd2hlbiBjdXJy
ZW50IG9wZXJhdGlvbgorICAgICAgICBpc24ndCBzZXQuCisKKyAgICAgICAgKiBVSVByb2Nlc3Mv
R2VuZXJpY0NhbGxiYWNrLmg6CisgICAgICAgIChXZWJLaXQ6OkNvbXB1dGVkUGFnZXNDYWxsYmFj
azo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6Q29tcHV0ZWRQYWdlc0NhbGxiYWNrOjp+Q29t
cHV0ZWRQYWdlc0NhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6Q29tcHV0ZWRQYWdlc0NhbGxi
YWNrOjpwZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUpOgorICAgICAgICAoV2ViS2l0OjpD
b21wdXRlZFBhZ2VzQ2FsbGJhY2s6OmludmFsaWRhdGUpOgorICAgICAgICAoV2ViS2l0OjpDb21w
dXRlZFBhZ2VzQ2FsbGJhY2s6OmNhbGxiYWNrSUQpOgorICAgICAgICAoV2ViS2l0OjpDb21wdXRl
ZFBhZ2VzQ2FsbGJhY2s6OmdlbmVyYXRlQ2FsbGJhY2tJRCk6CisgICAgICAgIChXZWJLaXQ6OkNv
bXB1dGVkUGFnZXNDYWxsYmFjazo6Q29tcHV0ZWRQYWdlc0NhbGxiYWNrKToKKyAgICAgICAgQWRk
ZWQgQ29tcHV0ZWRQYWdlc0NhbGxiYWNrLCB3aGljaCByZXR1cm5zIGEgdmVjdG9yIG9mIEludFJl
Y3RzIGFuZCBhIGRvdWJsZS4gSG9wZWZ1bGx5LAorICAgICAgICBpdCB3aWxsIGJlY29tZSBhIHNw
ZWNpYWxpemF0aW9uIG9mIEdlbmVyaWNDYWxsYmFjayBvbmUgZGF5LgorCisgICAgICAgICogVUlQ
cm9jZXNzL1dlYlBhZ2VQcm94eS5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6
Y2xvc2UpOiBBZGRlZCBtX3ZvaWRDYWxsYmFja3MgLSBpdCBsb29rcyBsaWtlIHRoZXkgd2VyZSBv
bWl0dGVkCisgICAgICAgIGJ5IGFjY2lkZW50LgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJv
eHk6OmNvbXB1dGVkUGFnZXNDYWxsYmFjayk6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlUHJveHk6OnByb2Nlc3NEaWRDcmFzaCk6IEFkZGVkIG1fY29tcHV0ZWRQYWdlc0NhbGxiYWNr
cy4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5Ojpjb21wdXRlUGFnZXNGb3JQcmludGlu
Zyk6IEFzeW5jIG5vdyEKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkcmF3UmVjdFRv
UERGKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZHJhd1BhZ2VzVG9Q
REYpOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lmg6CisKKyAgICAg
ICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluOiBBZGRlZCBDb21wdXRlZFBh
Z2VzQ2FsbGJhY2suCisKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2U6OmJlZ2luUHJpbnRpbmcpOiBUaGlzIGlzIG5vIGxv
bmdlciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lc3NhZ2UuCisgICAgICAgIChXZWJLaXQ6Oldl
YlBhZ2U6OmNvbXB1dGVQYWdlc0ZvclByaW50aW5nKTogU2VuZCBhc3luYyByZXNwb25zZS4KKyAg
ICAgICAgKFdlYktpdDo6V2ViUGFnZTo6ZHJhd1JlY3RUb1BERik6IFRoaXMgZnVuY3Rpb24gdXNl
ZCB0byBkcmF3IGludG8gb3JpZ2luYWwKKyAgICAgICAgbG9jYXRpb24gYXQgZnJhbWUgY29vcmRp
bmF0ZXMsIGFuZCBub3cgaXQgZHJhd3MgYXQgKDAsIDApLgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlOjpkcmF3UGFnZXNUb1BERik6IEFkZGVkIC0gbWFrZSBhIG11bHRpLXBhZ2UgUERGLgorICAg
ICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmg6CisKKyAgICAgICAgKiBXZWJQcm9j
ZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbjogRHJhd1JlY3RUb1BERiBhbmQgRHJhd1Bh
Z2VzVG9QREYgbm93IGltcGxpY2l0bHkKKyAgICAgICAgc3RhcnQgcHJpbnRpbmcgdG8gYXZvaWQg
ZXh0cmEgbWVzc2FnaW5nLgorCiAyMDExLTAxLTI2ICBCcmlhbiBXZWluc3RlaW4gIDxid2VpbnN0
ZWluQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBKb2huIFN1bGxpdmFuLgpJbmRl
eDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0dlbmVyaWNDYWxsYmFjay5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9HZW5lcmljQ2FsbGJhY2suaAkocmV2aXNpb24g
NzY2NTQpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvR2VuZXJpY0NhbGxiYWNrLmgJKHdv
cmtpbmcgY29weSkKQEAgLTg5LDYgKzg5LDYxIEBAIHByaXZhdGU6CiAgICAgdWludDY0X3QgbV9j
YWxsYmFja0lEOwogfTsKIAorLy8gRklYTUU6IE1ha2UgYSB2ZXJzaW9uIG9mIEdlbmVyaWNDYWxs
YmFjayB3aXRoIHR3byBhcmd1bWVudHMsIGFuZCBkZWZpbmUgQ29tcHV0ZWRQYWdlc0NhbGxiYWNr
IGFzIGEgc3BlY2lhbGl6YXRpb24uCitjbGFzcyBDb21wdXRlZFBhZ2VzQ2FsbGJhY2sgOiBwdWJs
aWMgUmVmQ291bnRlZDxDb21wdXRlZFBhZ2VzQ2FsbGJhY2s+IHsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIHZvaWQgKCpDYWxsYmFja0Z1bmN0aW9uKShjb25zdCBWZWN0b3I8V2ViQ29yZTo6SW50UmVj
dD4mLCBkb3VibGUsIFdLRXJyb3JSZWYsIHZvaWQqKTsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRy
PENvbXB1dGVkUGFnZXNDYWxsYmFjaz4gY3JlYXRlKHZvaWQqIGNvbnRleHQsIENhbGxiYWNrRnVu
Y3Rpb24gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENvbXB1
dGVkUGFnZXNDYWxsYmFjayhjb250ZXh0LCBjYWxsYmFjaykpOworICAgIH0KKworICAgIH5Db21w
dXRlZFBhZ2VzQ2FsbGJhY2soKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFtX2NhbGxiYWNrKTsK
KyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1ZShjb25zdCBW
ZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4mIHJldHVyblZhbHVlMSwgZG91YmxlIHJldHVyblZhbHVl
MikKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrKTsKKworICAgICAgICBtX2NhbGxi
YWNrKHJldHVyblZhbHVlMSwgcmV0dXJuVmFsdWUyLCAwLCBtX2NvbnRleHQpOworCisgICAgICAg
IG1fY2FsbGJhY2sgPSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGUoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKG1fY2FsbGJhY2spOworCisgICAgICAgIFJlZlB0cjxXZWJFcnJv
cj4gZXJyb3IgPSBXZWJFcnJvcjo6Y3JlYXRlKCk7CisgICAgICAgIG1fY2FsbGJhY2soVmVjdG9y
PFdlYkNvcmU6OkludFJlY3Q+KCksIDAsIHRvQVBJKGVycm9yLmdldCgpKSwgbV9jb250ZXh0KTsK
KyAgICAgICAgCisgICAgICAgIG1fY2FsbGJhY2sgPSAwOworICAgIH0KKworICAgIHVpbnQ2NF90
IGNhbGxiYWNrSUQoKSBjb25zdCB7IHJldHVybiBtX2NhbGxiYWNrSUQ7IH0KKworcHJpdmF0ZToK
KyAgICBzdGF0aWMgdWludDY0X3QgZ2VuZXJhdGVDYWxsYmFja0lEKCkKKyAgICB7CisgICAgICAg
IHN0YXRpYyB1aW50NjRfdCB1bmlxdWVDYWxsYmFja0lEID0gMTsKKyAgICAgICAgcmV0dXJuIHVu
aXF1ZUNhbGxiYWNrSUQrKzsKKyAgICB9CisKKyAgICBDb21wdXRlZFBhZ2VzQ2FsbGJhY2sodm9p
ZCogY29udGV4dCwgQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjaykKKyAgICAgICAgOiBtX2NvbnRl
eHQoY29udGV4dCkKKyAgICAgICAgLCBtX2NhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICAsIG1f
Y2FsbGJhY2tJRChnZW5lcmF0ZUNhbGxiYWNrSUQoKSkKKyAgICB7CisgICAgfQorCisgICAgdm9p
ZCogbV9jb250ZXh0OworICAgIENhbGxiYWNrRnVuY3Rpb24gbV9jYWxsYmFjazsKKyAgICB1aW50
NjRfdCBtX2NhbGxiYWNrSUQ7Cit9OworCiB0ZW1wbGF0ZTx0eXBlbmFtZSBBUElSZXR1cm5WYWx1
ZVR5cGUsIHR5cGVuYW1lIEludGVybmFsUmV0dXJuVmFsdWVUeXBlID0gdHlwZW5hbWUgQVBJVHlw
ZUluZm88QVBJUmV0dXJuVmFsdWVUeXBlPjo6SW1wbFR5cGU+CiBjbGFzcyBHZW5lcmljQ2FsbGJh
Y2sgOiBwdWJsaWMgUmVmQ291bnRlZDxHZW5lcmljQ2FsbGJhY2s8QVBJUmV0dXJuVmFsdWVUeXBl
LCBJbnRlcm5hbFJldHVyblZhbHVlVHlwZT4gPiB7CiBwdWJsaWM6CkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkocmV2aXNpb24gNzY2NTQpCisrKyBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
Mjc0LDggKzI3NCwxMCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Y2xvc2UoKQogCiAgICAgbV90b29s
VGlwID0gU3RyaW5nKCk7CiAKKyAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV92b2lkQ2FsbGJh
Y2tzKTsKICAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9kYXRhQ2FsbGJhY2tzKTsKICAgICBp
bnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9zdHJpbmdDYWxsYmFja3MpOworICAgIGludmFsaWRhdGVD
YWxsYmFja01hcChtX2NvbXB1dGVkUGFnZXNDYWxsYmFja3MpOwogCiAgICAgVmVjdG9yPFdlYkVk
aXRDb21tYW5kUHJveHkqPiBlZGl0Q29tbWFuZFZlY3RvcjsKICAgICBjb3B5VG9WZWN0b3IobV9l
ZGl0Q29tbWFuZFNldCwgZWRpdENvbW1hbmRWZWN0b3IpOwpAQCAtMjE4OCw2ICsyMTkwLDE3IEBA
IHZvaWQgV2ViUGFnZVByb3h5OjpzdHJpbmdDYWxsYmFjayhjb25zdCAKICAgICBjYWxsYmFjay0+
cGVyZm9ybUNhbGxiYWNrV2l0aFJldHVyblZhbHVlKHJlc3VsdFN0cmluZy5pbXBsKCkpOwogfQog
Cit2b2lkIFdlYlBhZ2VQcm94eTo6Y29tcHV0ZWRQYWdlc0NhbGxiYWNrKGNvbnN0IFZlY3RvcjxX
ZWJDb3JlOjpJbnRSZWN0PiYgcGFnZVJlY3RzLCBkb3VibGUgdG90YWxTY2FsZUZhY3RvckZvclBy
aW50aW5nLCB1aW50NjRfdCBjYWxsYmFja0lEKQoreworICAgIFJlZlB0cjxDb21wdXRlZFBhZ2Vz
Q2FsbGJhY2s+IGNhbGxiYWNrID0gbV9jb21wdXRlZFBhZ2VzQ2FsbGJhY2tzLnRha2UoY2FsbGJh
Y2tJRCk7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICAvLyBGSVhNRTogTG9nIGVycm9y
IG9yIGFzc2VydC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbGxiYWNrLT5wZXJm
b3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUocGFnZVJlY3RzLCB0b3RhbFNjYWxlRmFjdG9yRm9y
UHJpbnRpbmcpOworfQorCiAjaWYgUExBVEZPUk0oTUFDKQogdm9pZCBXZWJQYWdlUHJveHk6OnNl
bmRBY2Nlc3NpYmlsaXR5UHJlc2VudGVyVG9rZW4oY29uc3QgQ29yZUlQQzo6RGF0YVJlZmVyZW5j
ZSYgdG9rZW4pCiB7CkBAIC0yMjc4LDYgKzIyOTEsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6cHJv
Y2Vzc0RpZENyYXNoKCkKICAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV92b2lkQ2FsbGJhY2tz
KTsKICAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9kYXRhQ2FsbGJhY2tzKTsKICAgICBpbnZh
bGlkYXRlQ2FsbGJhY2tNYXAobV9zdHJpbmdDYWxsYmFja3MpOworICAgIGludmFsaWRhdGVDYWxs
YmFja01hcChtX2NvbXB1dGVkUGFnZXNDYWxsYmFja3MpOwogCiAgICAgVmVjdG9yPFdlYkVkaXRD
b21tYW5kUHJveHkqPiBlZGl0Q29tbWFuZFZlY3RvcjsKICAgICBjb3B5VG9WZWN0b3IobV9lZGl0
Q29tbWFuZFNldCwgZWRpdENvbW1hbmRWZWN0b3IpOwpAQCAtMjQyNiwxNSArMjQ0MCw2IEBAIHZv
aWQgV2ViUGFnZVByb3h5OjpiYWNrRm9yd2FyZFJlbW92ZWRJdGUKICAgICBwcm9jZXNzKCktPnNl
bmQoTWVzc2FnZXM6OldlYlBhZ2U6OkRpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShpdGVtSUQpLCBt
X3BhZ2VJRCk7CiB9CiAKLXZvaWQgV2ViUGFnZVByb3h5OjpiZWdpblByaW50aW5nKFdlYkZyYW1l
UHJveHkqIGZyYW1lLCBjb25zdCBQcmludEluZm8mIHByaW50SW5mbykKLXsKLSAgICBpZiAobV9p
c0luUHJpbnRpbmdNb2RlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2lzSW5QcmludGluZ01v
ZGUgPSB0cnVlOwotICAgIHByb2Nlc3MoKS0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6QmVnaW5Q
cmludGluZyhmcmFtZS0+ZnJhbWVJRCgpLCBwcmludEluZm8pLCBtX3BhZ2VJRCk7Ci19Ci0KIHZv
aWQgV2ViUGFnZVByb3h5OjplbmRQcmludGluZygpCiB7CiAgICAgaWYgKCFtX2lzSW5QcmludGlu
Z01vZGUpCkBAIC0yNDQ0LDE3ICsyNDQ5LDI4IEBAIHZvaWQgV2ViUGFnZVByb3h5OjplbmRQcmlu
dGluZygpCiAgICAgcHJvY2VzcygpLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpFbmRQcmludGlu
ZygpLCBtX3BhZ2VJRCk7CiB9CiAKLXZvaWQgV2ViUGFnZVByb3h5Ojpjb21wdXRlUGFnZXNGb3JQ
cmludGluZyhXZWJGcmFtZVByb3h5KiBmcmFtZSwgY29uc3QgUHJpbnRJbmZvJiBwcmludEluZm8s
IFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiYgcmVzdWx0UGFnZVJlY3RzLCBkb3VibGUmIHJlc3Vs
dFRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZykKK3ZvaWQgV2ViUGFnZVByb3h5Ojpjb21wdXRl
UGFnZXNGb3JQcmludGluZyhXZWJGcmFtZVByb3h5KiBmcmFtZSwgY29uc3QgUHJpbnRJbmZvJiBw
cmludEluZm8sIFBhc3NSZWZQdHI8Q29tcHV0ZWRQYWdlc0NhbGxiYWNrPiBjYWxsYmFjaykKIHsK
LSAgICAvLyBMYXlvdXQgZm9yIHByaW50aW5nIGNhbiB0YWtlIGEgbG9uZyB0aW1lLCBidXQgd2Ug
bmVlZCB0byBoYXZlIHRoZSBhbnN3ZXIuCi0gICAgcHJvY2VzcygpLT5zZW5kU3luYyhNZXNzYWdl
czo6V2ViUGFnZTo6Q29tcHV0ZVBhZ2VzRm9yUHJpbnRpbmcoZnJhbWUtPmZyYW1lSUQoKSwgcHJp
bnRJbmZvKSwgTWVzc2FnZXM6OldlYlBhZ2U6OkNvbXB1dGVQYWdlc0ZvclByaW50aW5nOjpSZXBs
eShyZXN1bHRQYWdlUmVjdHMsIHJlc3VsdFRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZyksIG1f
cGFnZUlEKTsKKyAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQo
KTsKKyAgICBtX2NvbXB1dGVkUGFnZXNDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNr
LmdldCgpKTsKKyAgICBwcm9jZXNzKCktPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkNvbXB1dGVQ
YWdlc0ZvclByaW50aW5nKGZyYW1lLT5mcmFtZUlEKCksIHByaW50SW5mbywgY2FsbGJhY2tJRCks
IG1fcGFnZUlEKTsKIH0KIAogI2lmIFBMQVRGT1JNKE1BQykKLXZvaWQgV2ViUGFnZVByb3h5Ojpk
cmF3UmVjdFRvUERGKFdlYkZyYW1lUHJveHkqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiByZWN0LCBW
ZWN0b3I8dWludDhfdD4mIHBkZkRhdGEpCit2b2lkIFdlYlBhZ2VQcm94eTo6ZHJhd1JlY3RUb1BE
RihXZWJGcmFtZVByb3h5KiBmcmFtZSwgY29uc3QgUHJpbnRJbmZvJiBwcmludEluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QsIFBhc3NSZWZQdHI8RGF0YUNhbGxiYWNrPiBjYWxsYmFjaykKK3sKKyAg
ICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBtX2Rh
dGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX2lzSW5Q
cmludGluZ01vZGUgPSB0cnVlOworICAgIHByb2Nlc3MoKS0+c2VuZChNZXNzYWdlczo6V2ViUGFn
ZTo6RHJhd1JlY3RUb1BERihmcmFtZS0+ZnJhbWVJRCgpLCBwcmludEluZm8sIHJlY3QsIGNhbGxi
YWNrSUQpLCBtX3BhZ2VJRCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5OjpkcmF3UGFnZXNUb1BE
RihXZWJGcmFtZVByb3h5KiBmcmFtZSwgY29uc3QgUHJpbnRJbmZvJiBwcmludEluZm8sIHVpbnQz
Ml90IGZpcnN0LCB1aW50MzJfdCBjb3VudCwgUGFzc1JlZlB0cjxEYXRhQ2FsbGJhY2s+IGNhbGxi
YWNrKQogewotICAgIC8vIFByaW50aW5nIGNhbiB0YWtlIGEgbG9uZyB0aW1lLCBidXQgd2UgbmVl
ZCB0byBoYXZlIHRoZSBhbnN3ZXIuCi0gICAgcHJvY2VzcygpLT5zZW5kU3luYyhNZXNzYWdlczo6
V2ViUGFnZTo6RHJhd1JlY3RUb1BERihmcmFtZS0+ZnJhbWVJRCgpLCByZWN0KSwgTWVzc2FnZXM6
OldlYlBhZ2U6OkRyYXdSZWN0VG9QREY6OlJlcGx5KHBkZkRhdGEpLCBtX3BhZ2VJRCk7CisgICAg
dWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7CisgICAgbV9kYXRh
Q2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjay5nZXQoKSk7CisgICAgbV9pc0luUHJp
bnRpbmdNb2RlID0gdHJ1ZTsKKyAgICBwcm9jZXNzKCktPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6
OkRyYXdQYWdlc1RvUERGKGZyYW1lLT5mcmFtZUlEKCksIHByaW50SW5mbywgZmlyc3QsIGNvdW50
LCBjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQogI2VuZGlmCiAKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHJldmlzaW9uIDc2NjU0KQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNTcsMTEg
KzM1NywxMSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRTbWFydEluc2VydERlbGV0ZUVuYWJsZWQo
Ym9vbCk7CiAjZW5kaWYKIAotICAgIHZvaWQgYmVnaW5QcmludGluZyhXZWJGcmFtZVByb3h5Kiwg
Y29uc3QgUHJpbnRJbmZvJik7CiAgICAgdm9pZCBlbmRQcmludGluZygpOwotICAgIHZvaWQgY29t
cHV0ZVBhZ2VzRm9yUHJpbnRpbmcoV2ViRnJhbWVQcm94eSosIGNvbnN0IFByaW50SW5mbyYsIFZl
Y3RvcjxXZWJDb3JlOjpJbnRSZWN0PiYgcmVzdWx0UGFnZVJlY3RzLCBkb3VibGUmIHJlc3VsdFRv
dGFsU2NhbGVGYWN0b3JGb3JQcmludGluZyk7CisgICAgdm9pZCBjb21wdXRlUGFnZXNGb3JQcmlu
dGluZyhXZWJGcmFtZVByb3h5KiwgY29uc3QgUHJpbnRJbmZvJiwgUGFzc1JlZlB0cjxDb21wdXRl
ZFBhZ2VzQ2FsbGJhY2s+KTsKICNpZiBQTEFURk9STShNQUMpCi0gICAgdm9pZCBkcmF3UmVjdFRv
UERGKFdlYkZyYW1lUHJveHkqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgVmVjdG9yPHVpbnQ4
X3Q+JiBwZGZEYXRhKTsKKyAgICB2b2lkIGRyYXdSZWN0VG9QREYoV2ViRnJhbWVQcm94eSosIGNv
bnN0IFByaW50SW5mbyYsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBQYXNzUmVmUHRyPERhdGFD
YWxsYmFjaz4pOworICAgIHZvaWQgZHJhd1BhZ2VzVG9QREYoV2ViRnJhbWVQcm94eSosIGNvbnN0
IFByaW50SW5mbyYsIHVpbnQzMl90IGZpcnN0LCB1aW50MzJfdCBjb3VudCwgUGFzc1JlZlB0cjxE
YXRhQ2FsbGJhY2s+KTsKICNlbmRpZgogCiBwcml2YXRlOgpAQCAtNTE2LDYgKzUxNiw3IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCB2b2lkQ2FsbGJhY2sodWludDY0X3QpOwogICAgIHZvaWQgZGF0YUNh
bGxiYWNrKGNvbnN0IENvcmVJUEM6OkRhdGFSZWZlcmVuY2UmLCB1aW50NjRfdCk7CiAgICAgdm9p
ZCBzdHJpbmdDYWxsYmFjayhjb25zdCBTdHJpbmcmLCB1aW50NjRfdCk7CisgICAgdm9pZCBjb21w
dXRlZFBhZ2VzQ2FsbGJhY2soY29uc3QgVmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+JiwgZG91Ymxl
IHRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZywgdWludDY0X3QpOwogCiAgICAgdm9pZCBmb2N1
c2VkRnJhbWVDaGFuZ2VkKHVpbnQ2NF90IGZyYW1lSUQpOwogICAgIHZvaWQgZnJhbWVTZXRMYXJn
ZXN0RnJhbWVDaGFuZ2VkKHVpbnQ2NF90IGZyYW1lSUQpOwpAQCAtNTYzLDYgKzU2NCw3IEBAIHBy
aXZhdGU6CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFZvaWRDYWxsYmFjaz4gPiBtX3Zv
aWRDYWxsYmFja3M7CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPERhdGFDYWxsYmFjaz4g
PiBtX2RhdGFDYWxsYmFja3M7CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFN0cmluZ0Nh
bGxiYWNrPiA+IG1fc3RyaW5nQ2FsbGJhY2tzOworICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0
cjxDb21wdXRlZFBhZ2VzQ2FsbGJhY2s+ID4gbV9jb21wdXRlZFBhZ2VzQ2FsbGJhY2tzOwogCiAg
ICAgSGFzaFNldDxXZWJFZGl0Q29tbWFuZFByb3h5Kj4gbV9lZGl0Q29tbWFuZFNldDsKIApJbmRl
eDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2Vz
LmluCShyZXZpc2lvbiA3NjY1NCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdl
UHJveHkubWVzc2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTExNiw2ICsxMTYsNyBAQCBtZXNz
YWdlcyAtPiBXZWJQYWdlUHJveHkgewogICAgIFZvaWRDYWxsYmFjayh1aW50NjRfdCBjYWxsYmFj
a0lEKQogICAgIERhdGFDYWxsYmFjayhDb3JlSVBDOjpEYXRhUmVmZXJlbmNlIHJlc3VsdERhdGEs
IHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgU3RyaW5nQ2FsbGJhY2soV1RGOjpTdHJpbmcgcmVz
dWx0U3RyaW5nLCB1aW50NjRfdCBjYWxsYmFja0lEKQorICAgIENvbXB1dGVkUGFnZXNDYWxsYmFj
ayhWZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gcGFnZVJlY3RzLCBkb3VibGUgdG90YWxTY2FsZUZh
Y3RvckZvclByaW50aW5nLCB1aW50NjRfdCBjYWxsYmFja0lEKQogCiAgICAgRGlkUmVjZWl2ZUFj
Y2Vzc2liaWxpdHlQYWdlVG9rZW4oQ29yZUlQQzo6RGF0YVJlZmVyZW5jZSBkYXRhKQogCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLUHJpbnRpbmdWaWV3
LmgJKHJldmlzaW9uIDc2NjU0KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMv
V0tQcmludGluZ1ZpZXcuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsOCArMjMsOCBAQAogICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbXBvcnQgPFdlYkNvcmUvSW50
UmVjdC5oPgotI2ltcG9ydCA8d3RmL1JlZlB0ci5oPgorI2ltcG9ydCA8V2ViQ29yZS9JbnRSZWN0
SGFzaC5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgogCiBAY2xhc3MgV0tQcmludGluZ1Zp
ZXdEYXRhOwogCkBAIC0zNCw5ICszNCwyNSBAQCBuYW1lc3BhY2UgV2ViS2l0IHsKIAogQGludGVy
ZmFjZSBXS1ByaW50aW5nVmlldyA6IE5TVmlldyB7CiBAcHVibGljCisgICAgTlNQcmludE9wZXJh
dGlvbiAqX3ByaW50T3BlcmF0aW9uOyAvLyBXS1ByaW50aW5nVmlldyBpcyBvd25lZCBieSB0aGUg
b3BlcmF0aW9uLgorCiAgICAgUmVmUHRyPFdlYktpdDo6V2ViRnJhbWVQcm94eT4gX3dlYkZyYW1l
OwotICAgIFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiBfd2ViUHJpbnRpbmdQYWdlUmVjdHM7Ci0g
ICAgZG91YmxlIF93ZWJUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7CisgICAgVmVjdG9yPFdl
YkNvcmU6OkludFJlY3Q+IF9wcmludGluZ1BhZ2VSZWN0czsKKyAgICBkb3VibGUgX3RvdGFsU2Nh
bGVGYWN0b3JGb3JQcmludGluZzsKKyAgICBIYXNoTWFwPFdlYkNvcmU6OkludFJlY3QsIFZlY3Rv
cjx1aW50OF90PiA+IF9wYWdlUHJldmlld3M7CisKKyAgICBWZWN0b3I8dWludDhfdD4gX3ByaW50
ZWRQYWdlc0RhdGE7CisgICAgUmV0YWluUHRyPENHUERGRG9jdW1lbnRSZWY+IF9wcmludGVkUGFn
ZXNQREZEb2N1bWVudDsKKworICAgIHVpbnQ2NF90IF9leHBlY3RlZENvbXB1dGVkUGFnZXNDYWxs
YmFjazsKKyAgICBIYXNoTWFwPHVpbnQ2NF90LCBXZWJDb3JlOjpJbnRSZWN0PiBfZXhwZWN0ZWRQ
cmV2aWV3Q2FsbGJhY2tzOworICAgIHVpbnQ2NF90IF9sYXRlc3RFeHBlY3RlZFByZXZpZXdDYWxs
YmFjazsKKyAgICB1aW50NjRfdCBfZXhwZWN0ZWRQcmludENhbGxiYWNrOworICAgIEJPT0wgX2lz
Rm9yY2luZ1ByZXZpZXdVcGRhdGU7CisKKyAgICBCT09MIF9pc1ByaW50aW5nRnJvbVNlY29uZGFy
eVRocmVhZDsKKyAgICBNdXRleCBfcHJpbnRpbmdDYWxsYmFja011dGV4OworICAgIFRocmVhZENv
bmRpdGlvbiBfcHJpbnRpbmdDYWxsYmFja0NvbmRpdGlvbjsKIH0KIAogLSAoaWQpaW5pdFdpdGhG
cmFtZVByb3h5OihXZWJLaXQ6OldlYkZyYW1lUHJveHkqKWZyYW1lOwpJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcubW0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcubW0JKHJldmlz
aW9uIDc2NjU0KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGlu
Z1ZpZXcubW0JKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2ltcG9ydCAiTG9n
Z2luZy5oIgogI2ltcG9ydCAiUHJpbnRJbmZvLmgiCisjaW1wb3J0ICJXZWJEYXRhLmgiCiAjaW1w
b3J0ICJXZWJQYWdlUHJveHkuaCIKIAogQGludGVyZmFjZSBOU1ZpZXcgKFdlYk5TVmlld0RldGFp
bHMpCkBAIC0zOSw2ICs0MCw4IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogTlNTdHJpbmcg
KiBjb25zdCBXZWJLaXRPcmlnaW5hbFRvcFByaW50aW5nTWFyZ2luS2V5ID0gQCJXZWJLaXRPcmln
aW5hbFRvcE1hcmdpbiI7CiBOU1N0cmluZyAqIGNvbnN0IFdlYktpdE9yaWdpbmFsQm90dG9tUHJp
bnRpbmdNYXJnaW5LZXkgPSBAIldlYktpdE9yaWdpbmFsQm90dG9tTWFyZ2luIjsKIAorTlNTdHJp
bmcgKiBjb25zdCBOU1ByaW50SW5mb0RpZENoYW5nZU5vdGlmaWNhdGlvbiA9IEAiTlNQcmludElu
Zm9EaWRDaGFuZ2UiOworCiBAaW1wbGVtZW50YXRpb24gV0tQcmludGluZ1ZpZXcKIAogLSAoaWQp
aW5pdFdpdGhGcmFtZVByb3h5OihXZWJGcmFtZVByb3h5KilmcmFtZQpAQCAtNTksOCArNjIsNyBA
QCAtIChCT09MKWlzRmxpcHBlZAogCiAtICh2b2lkKV9hZGp1c3RQcmludGluZ01hcmdpbnNGb3JI
ZWFkZXJBbmRGb290ZXIKIHsKLSAgICBOU1ByaW50T3BlcmF0aW9uICpwcmludE9wZXJhdGlvbiA9
IFtOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dOwotICAgIE5TUHJpbnRJbmZvICpp
bmZvID0gW3ByaW50T3BlcmF0aW9uIHByaW50SW5mb107CisgICAgTlNQcmludEluZm8gKmluZm8g
PSBbX3ByaW50T3BlcmF0aW9uIHByaW50SW5mb107CiAgICAgTlNNdXRhYmxlRGljdGlvbmFyeSAq
aW5mb0RpY3Rpb25hcnkgPSBbaW5mbyBkaWN0aW9uYXJ5XTsKIAogICAgIC8vIFdlIG5lZWQgdG8g
bW9kaWZ5IHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIGluIHRoZSBOU1ByaW50SW5mbyB0byBh
Y2NvdW50IGZvciB0aGUgc3BhY2UgbmVlZGVkIGJ5IHRoZQpAQCAtODgsNDAgKzkwLDIzNyBAQCAt
ICh2b2lkKV9hZGp1c3RQcmludGluZ01hcmdpbnNGb3JIZWFkZXJBCiAgICAgW2luZm8gc2V0Qm90
dG9tTWFyZ2luOm9yaWdpbmFsQm90dG9tTWFyZ2luICsgX3dlYkZyYW1lLT5wYWdlKCktPmZvb3Rl
ckhlaWdodChfd2ViRnJhbWUuZ2V0KCkpICogc2NhbGVdOwogfQogCi0tIChCT09MKWtub3dzUGFn
ZVJhbmdlOihOU1JhbmdlUG9pbnRlcilyYW5nZQorLSAoQk9PTClfaXNQcmludGluZ1ByZXZpZXcK
IHsKLSAgICBMT0coVmlldywgImtub3dzUGFnZVJhbmdlOiIpOwotICAgIFtzZWxmIF9hZGp1c3RQ
cmludGluZ01hcmdpbnNGb3JIZWFkZXJBbmRGb290ZXJdOworICAgIC8vIDxyZGFyOi8vcHJvYmxl
bS84OTAxMDQxPiBQbGVhc2UgYWRkIGFuIEFQSSByZXR1cm5pbmcgd2hldGhlciB0aGUgY3VycmVu
dCBwcmludCBvcGVyYXRpb24gaXMgZm9yIHByZXZpZXcuCisjaWYgIWRlZmluZWQoQlVJTERJTkdf
T05fU05PV19MRU9QQVJEKQorICAgIHJldHVybiBbX3ByaW50T3BlcmF0aW9uIHByZWZlcnJlZFJl
bmRlcmluZ1F1YWxpdHldID09IE5TUHJpbnRSZW5kZXJpbmdRdWFsaXR5UmVzcG9uc2l2ZTsKKyNl
bHNlCisgICAgLy8gQXNzdW1pbmcgdGhhdCBpZiBOU1ByaW50T3BlcmF0aW9uIGlzIGFsbG93ZWQg
dG8gc3Bhd24gYSB0aHJlYWQgZm9yIHByaW50aW5nLCBpdCB3aWxsLiBQcmludCBwcmV2aWV3IGRv
ZXNuJ3Qgc3Bhd24gYSB0aHJlYWQuCisgICAgcmV0dXJuICFfaXNQcmludGluZ0Zyb21TZWNvbmRh
cnlUaHJlYWQ7CisjZW5kaWYKK30KKworLSAodm9pZClfdXBkYXRlUHJldmlldworeworICAgIC8v
IDxyZGFyOi8vcHJvYmxlbS84OTAwOTIzPiBQbGVhc2UgYWRkIGFuIEFQSSB0byBmb3JjZSBwcmlu
dCBwcmV2aWV3IHVwZGF0ZS4KKyAgICBfaXNGb3JjaW5nUHJldmlld1VwZGF0ZSA9IFlFUzsKKyAg
ICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHBvc3ROb3RpZmljYXRpb25O
YW1lOk5TUHJpbnRJbmZvRGlkQ2hhbmdlTm90aWZpY2F0aW9uIG9iamVjdDpuaWxdOworICAgIF9p
c0ZvcmNpbmdQcmV2aWV3VXBkYXRlID0gTk87Cit9CisKKy0gKEJPT0wpX2hhc1BhZ2VSZWN0cwor
eworICAgIC8vIFdlYkNvcmUgYWx3YXlzIHByaW50cyBhdCBsZWFzdCBvbmUgcGFnZS4KKyAgICBy
ZXR1cm4gIV9wcmludGluZ1BhZ2VSZWN0cy5pc0VtcHR5KCk7Cit9CisKKy0gKHVpbnQ2NF90KV9l
eHBlY3RlZFByZXZpZXdDYWxsYmFja0ZvclJlY3Q6KGNvbnN0IEludFJlY3QmKXJlY3QKK3sKKyAg
ICBmb3IgKEhhc2hNYXA8dWludDY0X3QsIFdlYkNvcmU6OkludFJlY3Q+OjppdGVyYXRvciBpdGVy
ID0gX2V4cGVjdGVkUHJldmlld0NhbGxiYWNrcy5iZWdpbigpOyBpdGVyICE9IF9leHBlY3RlZFBy
ZXZpZXdDYWxsYmFja3MuZW5kKCk7ICsraXRlcikgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25k
ICA9PSByZWN0KQorICAgICAgICAgICAgcmV0dXJuIGl0ZXItPmZpcnN0OworICAgIH0KKyAgICBy
ZXR1cm4gMDsKK30KKworc3RydWN0IElQQ0NhbGxiYWNrQ29udGV4dCB7CisgICAgUmV0YWluUHRy
PFdLUHJpbnRpbmdWaWV3PiB2aWV3OworICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQ7Cit9OworCitz
dGF0aWMgdm9pZCBwYWdlRGlkRHJhd1RvUERGKFdLRGF0YVJlZiBkYXRhUmVmLCBXS0Vycm9yUmVm
LCB2b2lkKiBjdHgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIElQQ0Nh
bGxiYWNrQ29udGV4dCogY29udGV4dCA9IHN0YXRpY19jYXN0PElQQ0NhbGxiYWNrQ29udGV4dCo+
KGN0eCk7CisgICAgV0tQcmludGluZ1ZpZXcgKnZpZXcgPSBjb250ZXh0LT52aWV3LmdldCgpOwor
ICAgIFdlYkRhdGEqIGRhdGEgPSB0b0ltcGwoZGF0YVJlZik7CisKKyAgICBpZiAoY29udGV4dC0+
Y2FsbGJhY2tJRCA9PSB2aWV3LT5fZXhwZWN0ZWRQcmludENhbGxiYWNrKSB7CisgICAgICAgIEFT
U0VSVCghW3ZpZXcgX2lzUHJpbnRpbmdQcmV2aWV3XSk7CisgICAgICAgIEFTU0VSVCh2aWV3LT5f
cHJpbnRlZFBhZ2VzRGF0YS5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQoIXZpZXctPl9wcmlu
dGVkUGFnZXNQREZEb2N1bWVudCk7CisgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgICAgdmll
dy0+X3ByaW50ZWRQYWdlc0RhdGEuYXBwZW5kKGRhdGEtPmJ5dGVzKCksIGRhdGEtPnNpemUoKSk7
CisgICAgICAgIHZpZXctPl9leHBlY3RlZFByaW50Q2FsbGJhY2sgPSAwOworICAgICAgICB2aWV3
LT5fcHJpbnRpbmdDYWxsYmFja0NvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICAvLyBJZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBjaGFuZ2VkIHByaW50IHNldHVwLCB0aGVu
IHRoaXMgcmVzcG9uc2UgaXMgb2Jzb2xldGUuIEFuZCB0aGlzIGNhbGxiYWNrIGlzIG5vdCBpbiBy
ZXNwb25zZSB0byB0aGUgbGF0ZXN0IHJlcXVlc3QsCisgICAgICAgIC8vIHRoZW4gdGhlIHVzZXIg
aGFzIGFscmVhZHkgbW92ZWQgdG8gYW5vdGhlciBwYWdlIC0gd2UnbGwgY2FjaGUgdGhlIHJlc3Bv
bnNlLCBidXQgd29uJ3QgZHJhdyBpdC4KKyAgICAgICAgSGFzaE1hcDx1aW50NjRfdCwgV2ViQ29y
ZTo6SW50UmVjdD46Oml0ZXJhdG9yIGl0ZXIgPSB2aWV3LT5fZXhwZWN0ZWRQcmV2aWV3Q2FsbGJh
Y2tzLmZpbmQoY29udGV4dC0+Y2FsbGJhY2tJRCk7CisgICAgICAgIGlmIChpdGVyICE9IHZpZXct
Pl9leHBlY3RlZFByZXZpZXdDYWxsYmFja3MuZW5kKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChb
dmlldyBfaXNQcmludGluZ1ByZXZpZXddKTsKKworICAgICAgICAgICAgcGFpcjxIYXNoTWFwPFdl
YkNvcmU6OkludFJlY3QsIFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciwgYm9vbD4gZW50cnkg
PSB2aWV3LT5fcGFnZVByZXZpZXdzLmFkZChpdGVyLT5zZWNvbmQsIFZlY3Rvcjx1aW50OF90Pigp
KTsKKyAgICAgICAgICAgICgqZW50cnkuZmlyc3QpLnNlY29uZC5hcHBlbmQoZGF0YS0+Ynl0ZXMo
KSwgZGF0YS0+c2l6ZSgpKTsKKworICAgICAgICAgICAgYm9vbCByZWNlaXZlZFJlc3BvbnNlVG9M
YXRlc3RSZXF1ZXN0ID0gdmlldy0+X2xhdGVzdEV4cGVjdGVkUHJldmlld0NhbGxiYWNrID09IGNv
bnRleHQtPmNhbGxiYWNrSUQ7CisgICAgICAgICAgICB2aWV3LT5fbGF0ZXN0RXhwZWN0ZWRQcmV2
aWV3Q2FsbGJhY2sgPSAwOworICAgICAgICAgICAgdmlldy0+X2V4cGVjdGVkUHJldmlld0NhbGxi
YWNrcy5yZW1vdmUoY29udGV4dC0+Y2FsbGJhY2tJRCk7CisgICAgICAgICAgICBpZiAocmVjZWl2
ZWRSZXNwb25zZVRvTGF0ZXN0UmVxdWVzdCkKKyAgICAgICAgICAgICAgICBbdmlldyBfdXBkYXRl
UHJldmlld107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgY29udGV4dDsKK30KKwor
LSAodm9pZClfcHJlcGFyZVBERkRhdGFGb3JQcmludGluZ09uU2Vjb25kYXJ5VGhyZWFkCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghX3dlYkZyYW1lLT5wYWdlKCkp
IHsKKyAgICAgICAgX3ByaW50aW5nQ2FsbGJhY2tDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleExvY2tlciBsb2NrKF9wcmludGluZ0NhbGxiYWNr
TXV0ZXgpOworCisgICAgQVNTRVJUKFtzZWxmIF9oYXNQYWdlUmVjdHNdKTsKKyAgICBBU1NFUlQo
X3ByaW50ZWRQYWdlc0RhdGEuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoIV9wcmludGVkUGFnZXNQ
REZEb2N1bWVudCk7CisgICAgQVNTRVJUKCFfZXhwZWN0ZWRQcmludENhbGxiYWNrKTsKKworICAg
IHVuc2lnbmVkIGZpcnN0UGFnZSA9IFtbW1tfcHJpbnRPcGVyYXRpb24gcHJpbnRJbmZvXSBkaWN0
aW9uYXJ5XSBvYmplY3RGb3JLZXk6TlNQcmludEZpcnN0UGFnZV0gdW5zaWduZWRJbnRWYWx1ZV07
CisgICAgdW5zaWduZWQgbGFzdFBhZ2UgPSBbW1tbX3ByaW50T3BlcmF0aW9uIHByaW50SW5mb10g
ZGljdGlvbmFyeV0gb2JqZWN0Rm9yS2V5Ok5TUHJpbnRMYXN0UGFnZV0gdW5zaWduZWRJbnRWYWx1
ZV07CisgICAgaWYgKGxhc3RQYWdlID4gX3ByaW50aW5nUGFnZVJlY3RzLnNpemUoKSkgLy8gTGFz
dCBwYWdlIGlzIE5TSW50ZWdlck1heCBpZiBub3Qgc2V0IGJ5IHRoZSB1c2VyLgorICAgICAgICBs
YXN0UGFnZSA9IF9wcmludGluZ1BhZ2VSZWN0cy5zaXplKCk7CisKKyAgICBBU1NFUlQoZmlyc3RQ
YWdlID4gMCk7CisgICAgQVNTRVJUKGZpcnN0UGFnZSA8PSBsYXN0UGFnZSk7CisgICAgTE9HKFZp
ZXcsICJXS1ByaW50aW5nVmlldyByZXF1ZXN0aW5nIFBERiBkYXRhIGZvciBwYWdlcyAldS4uLiV1
IiwgZmlyc3RQYWdlLCBsYXN0UGFnZSk7CisKKyAgICBJUENDYWxsYmFja0NvbnRleHQqIGNvbnRl
eHQgPSBuZXcgSVBDQ2FsbGJhY2tDb250ZXh0OworICAgIFJlZlB0cjxEYXRhQ2FsbGJhY2s+IGNi
ID0gRGF0YUNhbGxiYWNrOjpjcmVhdGUoY29udGV4dCwgcGFnZURpZERyYXdUb1BERik7CisgICAg
X2V4cGVjdGVkUHJpbnRDYWxsYmFjayA9IGNiLT5jYWxsYmFja0lEKCk7CiAKLSAgICBfd2ViRnJh
bWUtPnBhZ2UoKS0+Y29tcHV0ZVBhZ2VzRm9yUHJpbnRpbmcoX3dlYkZyYW1lLmdldCgpLCBQcmlu
dEluZm8oW1tOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dIHByaW50SW5mb10pLCBf
d2ViUHJpbnRpbmdQYWdlUmVjdHMsIF93ZWJUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmcpOwor
ICAgIGNvbnRleHQtPnZpZXcgPSBzZWxmOworICAgIGNvbnRleHQtPmNhbGxiYWNrSUQgPSBjYi0+
Y2FsbGJhY2tJRCgpOwogCi0gICAgKnJhbmdlID0gTlNNYWtlUmFuZ2UoMSwgX3dlYlByaW50aW5n
UGFnZVJlY3RzLnNpemUoKSk7CisgICAgX3dlYkZyYW1lLT5wYWdlKCktPmRyYXdQYWdlc1RvUERG
KF93ZWJGcmFtZS5nZXQoKSwgUHJpbnRJbmZvKFtfcHJpbnRPcGVyYXRpb24gcHJpbnRJbmZvXSks
IGZpcnN0UGFnZSAtIDEsIGxhc3RQYWdlIC0gZmlyc3RQYWdlICsgMSwgY2IuZ2V0KCkpOworfQor
CitzdGF0aWMgdm9pZCBwYWdlRGlkQ29tcHV0ZVBhZ2VSZWN0cyhjb25zdCBWZWN0b3I8V2ViQ29y
ZTo6SW50UmVjdD4mIHBhZ2VSZWN0cywgZG91YmxlIHRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGlu
ZywgV0tFcnJvclJlZiwgdm9pZCogY3R4KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisKKyAgICBJUENDYWxsYmFja0NvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxJUENDYWxs
YmFja0NvbnRleHQqPihjdHgpOworICAgIFdLUHJpbnRpbmdWaWV3ICp2aWV3ID0gY29udGV4dC0+
dmlldy5nZXQoKTsKKworICAgIC8vIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGNoYW5nZWQgcHJp
bnQgc2V0dXAsIHRoZW4gdGhpcyByZXNwb25zZSBpcyBvYnNvbGV0ZS4KKyAgICBpZiAoY29udGV4
dC0+Y2FsbGJhY2tJRCA9PSB2aWV3LT5fZXhwZWN0ZWRDb21wdXRlZFBhZ2VzQ2FsbGJhY2spIHsK
KyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgQVNTRVJUKHZpZXctPl9l
eHBlY3RlZFByZXZpZXdDYWxsYmFja3MuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKCF2aWV3
LT5fbGF0ZXN0RXhwZWN0ZWRQcmV2aWV3Q2FsbGJhY2spOworICAgICAgICBBU1NFUlQoIXZpZXct
Pl9leHBlY3RlZFByaW50Q2FsbGJhY2spOworICAgICAgICBBU1NFUlQodmlldy0+X3BhZ2VQcmV2
aWV3cy5pc0VtcHR5KCkpOworICAgICAgICB2aWV3LT5fZXhwZWN0ZWRDb21wdXRlZFBhZ2VzQ2Fs
bGJhY2sgPSAwOworCisgICAgICAgIHZpZXctPl9wcmludGluZ1BhZ2VSZWN0cyA9IHBhZ2VSZWN0
czsKKyAgICAgICAgdmlldy0+X3RvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZyA9IHRvdGFsU2Nh
bGVGYWN0b3JGb3JQcmludGluZzsKKworICAgICAgICBpZiAoW3ZpZXcgX2lzUHJpbnRpbmdQcmV2
aWV3XSkgeworICAgICAgICAgICAgLy8gU2hvdyBwYWdlIGNvdW50LCBhbmQgYXNrIGZvciBhbiBh
Y3R1YWwgaW1hZ2UgdG8gcmVwbGFjZSBwbGFjZWhvbGRlci4KKyAgICAgICAgICAgIFt2aWV3IF91
cGRhdGVQcmV2aWV3XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdoZW4gcHJp
bnRpbmcsIHJlcXVlc3QgZXZlcnl0aGluZyB3ZSdsbCBuZWVkIGJlZm9yZWhhbmQuCisgICAgICAg
ICAgICBbdmlldyBfcHJlcGFyZVBERkRhdGFGb3JQcmludGluZ09uU2Vjb25kYXJ5VGhyZWFkXTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSBjb250ZXh0OworfQorCistIChCT09MKV9h
c2tQYWdlVG9Db21wdXRlUGFnZVJlY3RzCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KworICAgIGlmICghX3dlYkZyYW1lLT5wYWdlKCkpCisgICAgICAgIHJldHVybiBOTzsKKworICAg
IEFTU0VSVCghX2V4cGVjdGVkQ29tcHV0ZWRQYWdlc0NhbGxiYWNrKTsKKworICAgIElQQ0NhbGxi
YWNrQ29udGV4dCogY29udGV4dCA9IG5ldyBJUENDYWxsYmFja0NvbnRleHQ7CisgICAgUmVmUHRy
PENvbXB1dGVkUGFnZXNDYWxsYmFjaz4gY2IgPSBDb21wdXRlZFBhZ2VzQ2FsbGJhY2s6OmNyZWF0
ZShjb250ZXh0LCBwYWdlRGlkQ29tcHV0ZVBhZ2VSZWN0cyk7CisgICAgX2V4cGVjdGVkQ29tcHV0
ZWRQYWdlc0NhbGxiYWNrID0gY2ItPmNhbGxiYWNrSUQoKTsKKyAgICBjb250ZXh0LT52aWV3ID0g
c2VsZjsKKyAgICBjb250ZXh0LT5jYWxsYmFja0lEID0gX2V4cGVjdGVkQ29tcHV0ZWRQYWdlc0Nh
bGxiYWNrOworCisgICAgX3dlYkZyYW1lLT5wYWdlKCktPmNvbXB1dGVQYWdlc0ZvclByaW50aW5n
KF93ZWJGcmFtZS5nZXQoKSwgUHJpbnRJbmZvKFtfcHJpbnRPcGVyYXRpb24gcHJpbnRJbmZvXSks
IGNiLmdldCgpKTsKICAgICByZXR1cm4gWUVTOwogfQogCi0vLyBUYWtlIG92ZXIgcHJpbnRpbmcu
IEFwcEtpdCBhcHBsaWVzIGluY29ycmVjdCBjbGlwcGluZywgYW5kIGRvZXNuJ3QgcHJpbnQgcGFn
ZXMgYmV5b25kIHRoZSBmaXJzdCBvbmUuCi0tICh2b2lkKV9yZWN1cnNpdmVEaXNwbGF5UmVjdElm
TmVlZGVkSWdub3JpbmdPcGFjaXR5OihOU1JlY3QpcmVjdCBpc1Zpc2libGVSZWN0OihCT09MKWlz
VmlzaWJsZVJlY3QgcmVjdElzVmlzaWJsZVJlY3RGb3JWaWV3OihOU1ZpZXcgKil2aXNpYmxlVmll
dyB0b3BWaWV3OihCT09MKXRvcFZpZXcKK3N0YXRpYyB2b2lkIHByZXBhcmVEYXRhRm9yUHJpbnRp
bmdPblNlY29uZGFyeVRocmVhZCh2b2lkKiBjdHgpCiB7Ci0gICAgTE9HKFZpZXcsICJQcmludGlu
ZyByZWN0IHg6JWcsIHk6JWcsIHdpZHRoOiVnLCBoZWlnaHQ6JWciLCByZWN0Lm9yaWdpbi54LCBy
ZWN0Lm9yaWdpbi55LCByZWN0LnNpemUud2lkdGgsIHJlY3Quc2l6ZS5oZWlnaHQpOworICAgIEFT
U0VSVChpc01haW5UaHJlYWQoKSk7CiAKLSAgICBBU1NFUlQoc2VsZiA9PSB2aXNpYmxlVmlldyk7
CisgICAgV0tQcmludGluZ1ZpZXcgKnZpZXcgPSBzdGF0aWNfY2FzdDxXS1ByaW50aW5nVmlldyAq
PihjdHgpOworICAgIE11dGV4TG9ja2VyIGxvY2sodmlldy0+X3ByaW50aW5nQ2FsbGJhY2tNdXRl
eCk7CiAKLSAgICBfd2ViRnJhbWUtPnBhZ2UoKS0+YmVnaW5QcmludGluZyhfd2ViRnJhbWUuZ2V0
KCksIFByaW50SW5mbyhbW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl0gcHJpbnRJ
bmZvXSkpOworICAgIC8vIFdlIG1heSBoYXZlIHJlY2VpdmVkIHBhZ2UgcmVjdHMgd2hpbGUgYSBt
ZXNzYWdlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0cmF2ZWxlZCBmcm9tIHNlY29uZGFyeSB0aHJl
YWQgdG8gbWFpbiBvbmUuCisgICAgaWYgKFt2aWV3IF9oYXNQYWdlUmVjdHNdKSB7CisgICAgICAg
IFt2aWV3IF9wcmVwYXJlUERGRGF0YUZvclByaW50aW5nT25TZWNvbmRhcnlUaHJlYWRdOworICAg
ICAgICByZXR1cm47CisgICAgfQogCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgb3B0aW1pemVkIGZv
ciBwcmludCBwcmV2aWV3LiBHZXQgdGhlIHdob2xlIGRvY3VtZW50IGF0IG9uY2Ugd2hlbiBhY3R1
YWxseSBwcmludGluZy4KLSAgICBWZWN0b3I8dWludDhfdD4gcGRmRGF0YTsKLSAgICBfd2ViRnJh
bWUtPnBhZ2UoKS0+ZHJhd1JlY3RUb1BERihfd2ViRnJhbWUuZ2V0KCksIEludFJlY3QocmVjdCks
IHBkZkRhdGEpOworICAgIC8vIEEgcmVxdWVzdCBmb3IgcGFnZXMgaGFzIGFscmVhZHkgYmVlbiBt
YWRlLCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KKyAgICBpZiAodmlldy0+X2V4cGVjdGVk
Q29tcHV0ZWRQYWdlc0NhbGxiYWNrKQorICAgICAgICByZXR1cm47CiAKLSAgICBSZXRhaW5QdHI8
Q0dEYXRhUHJvdmlkZXJSZWY+IHBkZkRhdGFQcm92aWRlcihBZG9wdENGLCBDR0RhdGFQcm92aWRl
ckNyZWF0ZVdpdGhEYXRhKDAsIHBkZkRhdGEuZGF0YSgpLCBwZGZEYXRhLnNpemUoKSwgMCkpOwot
ICAgIFJldGFpblB0cjxDR1BERkRvY3VtZW50UmVmPiBwZGZEb2N1bWVudChBZG9wdENGLCBDR1BE
RkRvY3VtZW50Q3JlYXRlV2l0aFByb3ZpZGVyKHBkZkRhdGFQcm92aWRlci5nZXQoKSkpOworICAg
IFt2aWV3IF9hc2tQYWdlVG9Db21wdXRlUGFnZVJlY3RzXTsKK30KKworLSAoQk9PTClrbm93c1Bh
Z2VSYW5nZTooTlNSYW5nZVBvaW50ZXIpcmFuZ2UKK3sKKyAgICBMT0coVmlldywgIi1bV0tQcmlu
dGluZ1ZpZXcga25vd3NQYWdlUmFuZ2U6XSwgJXMsICVzIiwgW3NlbGYgX2hhc1BhZ2VSZWN0c10g
PyAicHJpbnQgZGF0YSBpcyBhdmFpbGFibGUiIDogInByaW50IGRhdGEgaXMgbm90IGF2YWlsYWJs
ZSB5ZXQiLCBpc01haW5UaHJlYWQoKSA/ICJvbiBtYWluIHRocmVhZCIgOiAib24gc2Vjb25kYXJ5
IHRocmVhZCIpOworICAgIEFTU0VSVChfcHJpbnRPcGVyYXRpb24gPT0gW05TUHJpbnRPcGVyYXRp
b24gY3VycmVudE9wZXJhdGlvbl0pOworCisgICAgLy8gQXNzdW1pbmcgdGhhdCBvbmNlIHdlIHN3
aXRjaCB0byBwcmludGluZyBmcm9tIGEgc2Vjb25kYXJ5IHRocmVhZCwgd2UgZG9uJ3QgZ28gYmFj
ay4KKyAgICBBU1NFUlQoIV9pc1ByaW50aW5nRnJvbVNlY29uZGFyeVRocmVhZCB8fCAhaXNNYWlu
VGhyZWFkKCkpOworICAgIGlmICghaXNNYWluVGhyZWFkKCkpCisgICAgICAgIF9pc1ByaW50aW5n
RnJvbVNlY29uZGFyeVRocmVhZCA9IFlFUzsKKworICAgIFtzZWxmIF9hZGp1c3RQcmludGluZ01h
cmdpbnNGb3JIZWFkZXJBbmRGb290ZXJdOworCisgICAgaWYgKFtzZWxmIF9oYXNQYWdlUmVjdHNd
KQorICAgICAgICAqcmFuZ2UgPSBOU01ha2VSYW5nZSgxLCBfcHJpbnRpbmdQYWdlUmVjdHMuc2l6
ZSgpKTsKKyAgICBlbHNlIGlmICghaXNNYWluVGhyZWFkKCkpIHsKKyAgICAgICAgQVNTRVJUKCFb
c2VsZiBfaXNQcmludGluZ1ByZXZpZXddKTsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhfcHJp
bnRpbmdDYWxsYmFja011dGV4KTsKKyAgICAgICAgY2FsbE9uTWFpblRocmVhZChwcmVwYXJlRGF0
YUZvclByaW50aW5nT25TZWNvbmRhcnlUaHJlYWQsIHNlbGYpOworICAgICAgICBfcHJpbnRpbmdD
YWxsYmFja0NvbmRpdGlvbi53YWl0KF9wcmludGluZ0NhbGxiYWNrTXV0ZXgpOworICAgICAgICAq
cmFuZ2UgPSBOU01ha2VSYW5nZSgxLCBfcHJpbnRpbmdQYWdlUmVjdHMuc2l6ZSgpKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBBU1NFUlQoW3NlbGYgX2lzUHJpbnRpbmdQcmV2aWV3XSk7CisKKyAg
ICAgICAgW3NlbGYgX2Fza1BhZ2VUb0NvbXB1dGVQYWdlUmVjdHNdOworCisgICAgICAgICpyYW5n
ZSA9IE5TTWFrZVJhbmdlKDEsIE5TSW50ZWdlck1heCk7CisgICAgfQorICAgIHJldHVybiBZRVM7
Cit9CisKKy0gKHVuc2lnbmVkKV9wYWdlRm9yUmVjdDooTlNSZWN0KXJlY3QKK3sKKyAgICAvLyBB
c3N1bWluZyB0aGF0IHJlY3QgZXhhY3RseSBtYXRjaGVzIG9uZSBvZiB0aGUgcGFnZXMuCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBfcHJpbnRpbmdQYWdlUmVjdHMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKHJlY3Qub3JpZ2luLnkgPT0gX3ByaW50aW5nUGFnZVJlY3RzW2ldLnkoKSkK
KyAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8vIEludmFs
aWQgcGFnZSBudW1iZXIuCit9CisKKy0gKHZvaWQpX2RyYXdQREZEb2N1bWVudDooQ0dQREZEb2N1
bWVudFJlZilwZGZEb2N1bWVudCBwYWdlOih1bnNpZ25lZClwYWdlIGF0UG9pbnQ6KE5TUG9pbnQp
cG9pbnQKK3sKICAgICBpZiAoIXBkZkRvY3VtZW50KSB7Ci0gICAgICAgIExPR19FUlJPUigiQ291
bGRuJ3QgY3JlYXRlIGEgUERGIGRvY3VtZW50IHdpdGggZGF0YSBwYXNzZWQgZm9yIHByaW50aW5n
Iik7CisgICAgICAgIExPR19FUlJPUigiQ291bGRuJ3QgY3JlYXRlIGEgUERGIGRvY3VtZW50IHdp
dGggZGF0YSBwYXNzZWQgZm9yIHByZXZpZXciKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAot
ICAgIENHUERGUGFnZVJlZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdldFBhZ2UocGRmRG9jdW1l
bnQuZ2V0KCksIDEpOworICAgIENHUERGUGFnZVJlZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdl
dFBhZ2UocGRmRG9jdW1lbnQsIHBhZ2UpOwogICAgIGlmICghcGRmUGFnZSkgewotICAgICAgICBM
T0dfRVJST1IoIlByaW50aW5nIGRhdGEgZG9lc24ndCBoYXZlIHBhZ2UgMSIpOworICAgICAgICBM
T0dfRVJST1IoIlByZXZpZXcgZGF0YSBkb2Vzbid0IGhhdmUgcGFnZSAlZCIsIHBhZ2UpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMzEsMTkgKzMzMCwxMTcgQEAgLSAodm9pZClfcmVj
dXJzaXZlRGlzcGxheVJlY3RJZk5lZWRlZElnbgogICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29u
dGV4dCk7CiAgICAgLy8gRmxpcCB0aGUgZGVzdGluYXRpb24uCiAgICAgQ0dDb250ZXh0U2NhbGVD
VE0oY29udGV4dCwgMSwgLTEpOwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAw
LCAtQ0dQREZQYWdlR2V0Qm94UmVjdChwZGZQYWdlLCBrQ0dQREZNZWRpYUJveCkuc2l6ZS5oZWln
aHQpOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCBwb2ludC54LCAtcG9pbnQu
eSAtQ0dQREZQYWdlR2V0Qm94UmVjdChwZGZQYWdlLCBrQ0dQREZNZWRpYUJveCkuc2l6ZS5oZWln
aHQpOwogICAgIENHQ29udGV4dERyYXdQREZQYWdlKGNvbnRleHQsIHBkZlBhZ2UpOwogICAgIENH
Q29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CiB9CiAKKy0gKHZvaWQpX2RyYXdQcmV2aWV3
OihOU1JlY3QpbnNSZWN0Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIElu
dFJlY3QgcmVjdChuc1JlY3QpOworICAgIEhhc2hNYXA8V2ViQ29yZTo6SW50UmVjdCwgVmVjdG9y
PHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIHBhZ2VQcmV2aWV3SXRlcmF0b3IgPSBfcGFnZVByZXZpZXdz
LmZpbmQocmVjdCk7CisgICAgaWYgKHBhZ2VQcmV2aWV3SXRlcmF0b3IgPT0gX3BhZ2VQcmV2aWV3
cy5lbmQoKSkgIHsKKyAgICAgICAgLy8gSXQncyB0b28gZWFybHkgdG8gYXNrIGZvciBwYWdlIHBy
ZXZpZXcgaWYgd2UgZG9uJ3QgZXZlbiBrbm93IHBhZ2Ugc2l6ZSBhbmQgc2NhbGUuCisgICAgICAg
IGlmIChbc2VsZiBfaGFzUGFnZVJlY3RzXSkgeworICAgICAgICAgICAgaWYgKHVpbnQ2NF90IGV4
aXN0aW5nQ2FsbGJhY2sgPSBbc2VsZiBfZXhwZWN0ZWRQcmV2aWV3Q2FsbGJhY2tGb3JSZWN0OnJl
Y3RdKSB7CisgICAgICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBhc2tlZCBmb3IgYSBwcmV2
aWV3IG9mIHRoaXMgcGFnZSwgYW5kIGFyZSB3YWl0aW5nIGZvciByZXNwb25zZS4KKyAgICAgICAg
ICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGFzayBhZ2Fpbi4KKyAgICAgICAgICAgICAg
ICBfbGF0ZXN0RXhwZWN0ZWRQcmV2aWV3Q2FsbGJhY2sgPSBleGlzdGluZ0NhbGxiYWNrOworICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aWV3IGlzbid0IGF2YWls
YWJsZSB5ZXQsIHJlcXVlc3QgaXQgYXN5bmNocm9ub3VzbHkuCisgICAgICAgICAgICAgICAgaWYg
KCFfd2ViRnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgICAgICAgICAgSVBDQ2FsbGJhY2tDb250ZXh0KiBjb250ZXh0ID0gbmV3IElQQ0NhbGxiYWNr
Q29udGV4dDsKKyAgICAgICAgICAgICAgICBSZWZQdHI8RGF0YUNhbGxiYWNrPiBjYiA9IERhdGFD
YWxsYmFjazo6Y3JlYXRlKGNvbnRleHQsIHBhZ2VEaWREcmF3VG9QREYpOworICAgICAgICAgICAg
ICAgIF9sYXRlc3RFeHBlY3RlZFByZXZpZXdDYWxsYmFjayA9IGNiLT5jYWxsYmFja0lEKCk7Cisg
ICAgICAgICAgICAgICAgX2V4cGVjdGVkUHJldmlld0NhbGxiYWNrcy5hZGQoX2xhdGVzdEV4cGVj
dGVkUHJldmlld0NhbGxiYWNrLCByZWN0KTsKKworICAgICAgICAgICAgICAgIGNvbnRleHQtPnZp
ZXcgPSBzZWxmOworICAgICAgICAgICAgICAgIGNvbnRleHQtPmNhbGxiYWNrSUQgPSBjYi0+Y2Fs
bGJhY2tJRCgpOworCisgICAgICAgICAgICAgICAgX3dlYkZyYW1lLT5wYWdlKCktPmRyYXdSZWN0
VG9QREYoX3dlYkZyYW1lLmdldCgpLCBQcmludEluZm8oW19wcmludE9wZXJhdGlvbiBwcmludElu
Zm9dKSwgcmVjdCwgY2IuZ2V0KCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBEcmF3IGEgcGxhY2Vob2xkZXIK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcGRm
RGF0YSA9IHBhZ2VQcmV2aWV3SXRlcmF0b3ItPnNlY29uZDsKKyAgICBSZXRhaW5QdHI8Q0dEYXRh
UHJvdmlkZXJSZWY+IHBkZkRhdGFQcm92aWRlcihBZG9wdENGLCBDR0RhdGFQcm92aWRlckNyZWF0
ZVdpdGhEYXRhKDAsIHBkZkRhdGEuZGF0YSgpLCBwZGZEYXRhLnNpemUoKSwgMCkpOworICAgIFJl
dGFpblB0cjxDR1BERkRvY3VtZW50UmVmPiBwZGZEb2N1bWVudChBZG9wdENGLCBDR1BERkRvY3Vt
ZW50Q3JlYXRlV2l0aFByb3ZpZGVyKHBkZkRhdGFQcm92aWRlci5nZXQoKSkpOworCisgICAgW3Nl
bGYgX2RyYXdQREZEb2N1bWVudDpwZGZEb2N1bWVudC5nZXQoKSBwYWdlOjEgYXRQb2ludDpOU01h
a2VQb2ludChuc1JlY3Qub3JpZ2luLngsIG5zUmVjdC5vcmlnaW4ueSldOworfQorCisvLyBUYWtl
IG92ZXIgcHJpbnRpbmcuIEFwcEtpdCBhcHBsaWVzIGluY29ycmVjdCBjbGlwcGluZywgYW5kIGRv
ZXNuJ3QgcHJpbnQgcGFnZXMgYmV5b25kIHRoZSBmaXJzdCBvbmUuCistICh2b2lkKV9yZWN1cnNp
dmVEaXNwbGF5UmVjdElmTmVlZGVkSWdub3JpbmdPcGFjaXR5OihOU1JlY3QpbnNSZWN0IGlzVmlz
aWJsZVJlY3Q6KEJPT0wpaXNWaXNpYmxlUmVjdCByZWN0SXNWaXNpYmxlUmVjdEZvclZpZXc6KE5T
VmlldyAqKXZpc2libGVWaWV3IHRvcFZpZXc6KEJPT0wpdG9wVmlldworeworICAgIExPRyhWaWV3
LCAiV0tQcmludGluZ1ZpZXcgcHJpbnRpbmcgcmVjdCB4OiVnLCB5OiVnLCB3aWR0aDolZywgaGVp
Z2h0OiVnIiwgbnNSZWN0Lm9yaWdpbi54LCBuc1JlY3Qub3JpZ2luLnksIG5zUmVjdC5zaXplLndp
ZHRoLCBuc1JlY3Quc2l6ZS5oZWlnaHQpOworCisgICAgQVNTRVJUKF9wcmludE9wZXJhdGlvbiA9
PSBbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSk7CisgICAgQVNTRVJUKHNlbGYg
PT0gdmlzaWJsZVZpZXcpOworCisgICAgaWYgKCFfd2ViRnJhbWUtPnBhZ2UoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKFtzZWxmIF9pc1ByaW50aW5nUHJldmlld10pIHsKKyAgICAgICAg
W3NlbGYgX2RyYXdQcmV2aWV3Om5zUmVjdF07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIV9wcmludGVkUGFnZXNEYXRh
LmlzRW1wdHkoKSk7IC8vIFByZXBhcmVkIGJ5IGtub3dzUGFnZVJhbmdlOgorCisgICAgaWYgKCFf
cHJpbnRlZFBhZ2VzUERGRG9jdW1lbnQpIHsKKyAgICAgICAgUmV0YWluUHRyPENHRGF0YVByb3Zp
ZGVyUmVmPiBwZGZEYXRhUHJvdmlkZXIoQWRvcHRDRiwgQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRo
RGF0YSgwLCBfcHJpbnRlZFBhZ2VzRGF0YS5kYXRhKCksIF9wcmludGVkUGFnZXNEYXRhLnNpemUo
KSwgMCkpOworICAgICAgICBfcHJpbnRlZFBhZ2VzUERGRG9jdW1lbnQuYWRvcHRDRihDR1BERkRv
Y3VtZW50Q3JlYXRlV2l0aFByb3ZpZGVyKHBkZkRhdGFQcm92aWRlci5nZXQoKSkpOworICAgIH0K
KworICAgIFtzZWxmIF9kcmF3UERGRG9jdW1lbnQ6X3ByaW50ZWRQYWdlc1BERkRvY3VtZW50Lmdl
dCgpIHBhZ2U6W3NlbGYgX3BhZ2VGb3JSZWN0Om5zUmVjdF0gYXRQb2ludDpOU01ha2VQb2ludChu
c1JlY3Qub3JpZ2luLngsIG5zUmVjdC5vcmlnaW4ueSldOworfQorCistICh2b2lkKV9kcmF3UGFn
ZUJvcmRlcldpdGhTaXplT25NYWluVGhyZWFkOihOU1NpemUpYm9yZGVyU2l6ZQoreworICAgIEFT
U0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICAvLyBXaGVuIHByaW50aW5nIGZyb20gYSBzZWNv
bmRhcnkgdGhyZWFkLCB0aGUgbWFpbiB0aHJlYWQgZG9lc24ndCBoYXZlIGdyYXBoaWNzIGNvbnRl
eHQgYW5kIHByaW50aW5nIG9wZXJhdGlvbiBzZXQgdXAuCisgICAgTlNHcmFwaGljc0NvbnRleHQg
KmN1cnJlbnRDb250ZXh0ID0gW05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRDb250ZXh0XTsKKyAg
ICBbTlNHcmFwaGljc0NvbnRleHQgc2V0Q3VycmVudENvbnRleHQ6W19wcmludE9wZXJhdGlvbiBj
b250ZXh0XV07CisKKyAgICBBU1NFUlQoIVtOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRp
b25dKTsKKyAgICBbTlNQcmludE9wZXJhdGlvbiBzZXRDdXJyZW50T3BlcmF0aW9uOl9wcmludE9w
ZXJhdGlvbl07CisKKyAgICBbc2VsZiBkcmF3UGFnZUJvcmRlcldpdGhTaXplOmJvcmRlclNpemVd
OworCisgICAgW05TUHJpbnRPcGVyYXRpb24gc2V0Q3VycmVudE9wZXJhdGlvbjpuaWxdOworICAg
IFtOU0dyYXBoaWNzQ29udGV4dCBzZXRDdXJyZW50Q29udGV4dDpjdXJyZW50Q29udGV4dF07Cit9
CisKIC0gKHZvaWQpZHJhd1BhZ2VCb3JkZXJXaXRoU2l6ZTooTlNTaXplKWJvcmRlclNpemUKIHsK
LSAgICBBU1NFUlQoTlNFcXVhbFNpemVzKGJvcmRlclNpemUsIFtbW05TUHJpbnRPcGVyYXRpb24g
Y3VycmVudE9wZXJhdGlvbl0gcHJpbnRJbmZvXSBwYXBlclNpemVdKSk7ICAgIAorICAgIEFTU0VS
VChOU0VxdWFsU2l6ZXMoYm9yZGVyU2l6ZSwgW1tfcHJpbnRPcGVyYXRpb24gcHJpbnRJbmZvXSBw
YXBlclNpemVdKSk7ICAgIAorICAgIEFTU0VSVChfcHJpbnRPcGVyYXRpb24gPT0gW05TUHJpbnRP
cGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl0pOworCisgICAgaWYgKCFpc01haW5UaHJlYWQoKSkg
eworICAgICAgICAvLyBEb24ndCBjYWxsIHRoZSBjbGllbnQgZnJvbSBhIHNlY29uZGFyeSB0aHJl
YWQuCisgICAgICAgIE5TSW52b2NhdGlvbiAqaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52
b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6W1dLUHJpbnRpbmdWaWV3IGluc3RhbmNlTWV0aG9k
U2lnbmF0dXJlRm9yU2VsZWN0b3I6QHNlbGVjdG9yKF9kcmF3UGFnZUJvcmRlcldpdGhTaXplT25N
YWluVGhyZWFkOildXTsKKyAgICAgICAgW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6QHNlbGVjdG9y
KF9kcmF3UGFnZUJvcmRlcldpdGhTaXplT25NYWluVGhyZWFkOildOworICAgICAgICBbaW52b2Nh
dGlvbiBzZXRBcmd1bWVudDomYm9yZGVyU2l6ZSBhdEluZGV4OjJdOworICAgICAgICBbaW52b2Nh
dGlvbiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6QHNlbGVjdG9yKGludm9rZVdpdGhUYXJn
ZXQ6KSB3aXRoT2JqZWN0OnNlbGYgd2FpdFVudGlsRG9uZTpZRVNdOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaWYgKCFfd2ViRnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOwog
CiAgICAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyIHJlY3QgaGVpZ2h0IHNjYWxlcyB3aXRoIHRo
ZSBwYWdlLCBidXQgdGhlIHdpZHRoIGlzIGFsd2F5cwogICAgIC8vIGFsbCB0aGUgd2F5IGFjcm9z
cyB0aGUgcHJpbnRlZCBwYWdlIChpbnNldCBieSBwcmludGluZyBtYXJnaW5zKS4KLSAgICBOU1By
aW50T3BlcmF0aW9uICpwcmludE9wZXJhdGlvbiA9IFtOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRP
cGVyYXRpb25dOwotICAgIE5TUHJpbnRJbmZvICpwcmludEluZm8gPSBbcHJpbnRPcGVyYXRpb24g
cHJpbnRJbmZvXTsKKyAgICBOU1ByaW50SW5mbyAqcHJpbnRJbmZvID0gW19wcmludE9wZXJhdGlv
biBwcmludEluZm9dOwogICAgIENHRmxvYXQgc2NhbGUgPSBbcHJpbnRJbmZvIHNjYWxpbmdGYWN0
b3JdOwogICAgIE5TU2l6ZSBwYXBlclNpemUgPSBbcHJpbnRJbmZvIHBhcGVyU2l6ZV07CiAgICAg
Q0dGbG9hdCBoZWFkZXJGb290ZXJMZWZ0ID0gW3ByaW50SW5mbyBsZWZ0TWFyZ2luXSAvIHNjYWxl
OwpAQCAtMTY4LDE0ICs0NjUsNDMgQEAgLSAodm9pZClkcmF3UGFnZUJvcmRlcldpdGhTaXplOihO
U1NpemUpYgogLy8gaWYgQXBwS2l0IG1ha2VzIGl0IFNQSS9BUEkuCiAtIChDR0Zsb2F0KV9wcm92
aWRlVG90YWxTY2FsZUZhY3RvckZvclByaW50T3BlcmF0aW9uOihOU1ByaW50T3BlcmF0aW9uICop
cHJpbnRPcGVyYXRpb24gCiB7Ci0gICAgcmV0dXJuIF93ZWJUb3RhbFNjYWxlRmFjdG9yRm9yUHJp
bnRpbmc7CisgICAgQVNTRVJUKF9wcmludE9wZXJhdGlvbiA9PSBwcmludE9wZXJhdGlvbik7Cisg
ICAgcmV0dXJuIF90b3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7CiB9CiAKIC8vIFJldHVybiB0
aGUgZHJhd2luZyByZWN0YW5nbGUgZm9yIGEgcGFydGljdWxhciBwYWdlIG51bWJlcgogLSAoTlNS
ZWN0KXJlY3RGb3JQYWdlOihOU0ludGVnZXIpcGFnZQogewotICAgIExPRyhWaWV3LCAicmVjdEZv
clBhZ2U6JWQgLT4geCAlZCwgeSAlZCwgd2lkdGggJWQsIGhlaWdodCAlZFxuIiwgKGludClwYWdl
LCBfd2ViUHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLngoKSwgX3dlYlByaW50aW5nUGFnZVJl
Y3RzW3BhZ2UgLSAxXS55KCksIF93ZWJQcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV0ud2lkdGgo
KSwgX3dlYlByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS5oZWlnaHQoKSk7Ci0gICAgcmV0dXJu
IF93ZWJQcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV07CisgICAgQVNTRVJUKF9wcmludE9wZXJh
dGlvbiA9PSBbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSk7CisgICAgaWYgKCFb
c2VsZiBfaGFzUGFnZVJlY3RzXSkgeworICAgICAgICBMT0coVmlldywgIi1bV0tQcmludGluZ1Zp
ZXcgcmVjdEZvclBhZ2U6JWRdIC0gZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSIsIChpbnQpcGFn
ZSk7CisgICAgICAgIC8vIFdlIG11c3QgYmUgc3RpbGwgY2FsY3VsYXRpbmcgdGhlIHBhZ2UgcmFu
Z2UuCisgICAgICAgIEFTU0VSVChfZXhwZWN0ZWRDb21wdXRlZFBhZ2VzQ2FsbGJhY2spOworICAg
ICAgICByZXR1cm4gTlNNYWtlUmVjdCgwLCAwLCAxLCAxKTsKKyAgICB9CisgICAgTE9HKFZpZXcs
ICItW1dLUHJpbnRpbmdWaWV3IHJlY3RGb3JQYWdlOiVkXSAtPiB4ICVkLCB5ICVkLCB3aWR0aCAl
ZCwgaGVpZ2h0ICVkIiwgKGludClwYWdlLCBfcHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLngo
KSwgX3ByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS55KCksIF9wcmludGluZ1BhZ2VSZWN0c1tw
YWdlIC0gMV0ud2lkdGgoKSwgX3ByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS5oZWlnaHQoKSk7
CisgICAgcmV0dXJuIF9wcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV07CiB9CiAKKy0gKHZvaWQp
ZW5kRG9jdW1lbnQKK3sKKyAgICBBU1NFUlQoX3ByaW50T3BlcmF0aW9uID09IFtOU1ByaW50T3Bl
cmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dKTsKKworICAgIC8vIEZvcmNpbmcgcHJldmlldyB1cGRh
dGUgZ2V0cyB1cyBoZXJlLCBidXQgcGFnZSBzZXR1cCBoYXNuJ3QgYWN0dWFsbHkgY2hhbmdlZC4K
KyAgICBpZiAoX2lzRm9yY2luZ1ByZXZpZXdVcGRhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IExPRyhWaWV3LCAiLVtXS1ByaW50aW5nVmlldyBlbmREb2N1bWVudF0gLSBjbGVhcmluZyBjYWNo
ZWQgZGF0YSIpOworCisgICAgLy8gQm90aCBleGlzdGluZyBkYXRhIGFuZCBwZW5kaW5nIHJlc3Bv
bnNlcyBhcmUgbm93IG9ic29sZXRlLgorICAgIF9wcmludGluZ1BhZ2VSZWN0cy5jbGVhcigpOwor
ICAgIF90b3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmcgPSAxOworICAgIF9wYWdlUHJldmlld3Mu
Y2xlYXIoKTsKKyAgICBfcHJpbnRlZFBhZ2VzRGF0YS5jbGVhcigpOworICAgIF9wcmludGVkUGFn
ZXNQREZEb2N1bWVudCA9IG51bGxwdHI7CisgICAgX2V4cGVjdGVkQ29tcHV0ZWRQYWdlc0NhbGxi
YWNrID0gMDsKKyAgICBfZXhwZWN0ZWRQcmV2aWV3Q2FsbGJhY2tzLmNsZWFyKCk7CisgICAgX2xh
dGVzdEV4cGVjdGVkUHJldmlld0NhbGxiYWNrID0gMDsKKyAgICBfZXhwZWN0ZWRQcmludENhbGxi
YWNrID0gMDsKK30KIEBlbmQKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFj
L1dLVmlldy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21h
Yy9XS1ZpZXcubW0JKHJldmlzaW9uIDc2NjU0KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9tYWMvV0tWaWV3Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMzY3LDcgKzEzNjcsMTAgQEAg
LSAoTlNQcmludE9wZXJhdGlvbiAqKXByaW50T3BlcmF0aW9uV2l0aAogICAgIH0gZWxzZSB7CiAg
ICAgICAgIFJldGFpblB0cjxXS1ByaW50aW5nVmlldz4gcHJpbnRpbmdWaWV3KEFkb3B0TlMsIFtb
V0tQcmludGluZ1ZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWVQcm94eTp0b0ltcGwoZnJhbWVSZWYp
XSk7CiAgICAgICAgIC8vIE5TUHJpbnRPcGVyYXRpb24gdGFrZXMgb3duZXJzaGlwIG9mIHRoZSB2
aWV3LgotICAgICAgICByZXR1cm4gW05TUHJpbnRPcGVyYXRpb24gcHJpbnRPcGVyYXRpb25XaXRo
VmlldzpwcmludGluZ1ZpZXcuZ2V0KCldOworICAgICAgICBOU1ByaW50T3BlcmF0aW9uICpwcmlu
dE9wZXJhdGlvbiA9IFtOU1ByaW50T3BlcmF0aW9uIHByaW50T3BlcmF0aW9uV2l0aFZpZXc6cHJp
bnRpbmdWaWV3LmdldCgpXTsKKyAgICAgICAgW3ByaW50T3BlcmF0aW9uIHNldENhblNwYXduU2Vw
YXJhdGVUaHJlYWQ6WUVTXTsKKyAgICAgICAgcHJpbnRpbmdWaWV3LT5fcHJpbnRPcGVyYXRpb24g
PSBwcmludE9wZXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIHByaW50T3BlcmF0aW9uOwogICAgIH0K
IH0KIApJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdl
LmNwcAkocmV2aXNpb24gNzY2NTQpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBh
Z2UvV2ViUGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3NTAsMTYgKzE3NTAsOCBAQCB2b2lk
IFdlYlBhZ2U6OnN0b3BTcGVha2luZygpCiAKICNlbmRpZgogCi12b2lkIFdlYlBhZ2U6OmJlZ2lu
UHJpbnRpbmcodWludDY0X3QgZnJhbWVJRCwgY29uc3QgUHJpbnRJbmZvJiBwcmludEluZm8pCit2
b2lkIFdlYlBhZ2U6OmJlZ2luUHJpbnRpbmcoRnJhbWUqIGNvcmVGcmFtZSwgY29uc3QgUHJpbnRJ
bmZvJiBwcmludEluZm8pCiB7Ci0gICAgV2ViRnJhbWUqIGZyYW1lID0gV2ViUHJvY2Vzczo6c2hh
cmVkKCkud2ViRnJhbWUoZnJhbWVJRCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgRnJhbWUqIGNvcmVGcmFtZSA9IGZyYW1lLT5jb3JlRnJhbWUoKTsKLSAgICBpZiAo
IWNvcmVGcmFtZSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgaWYgKCFtX3ByaW50Q29udGV4dCkK
ICAgICAgICAgbV9wcmludENvbnRleHQgPSBhZG9wdFB0cihuZXcgUHJpbnRDb250ZXh0KGNvcmVG
cmFtZSkpOwogCkBAIC0xNzcxLDU3ICsxNzYzLDk0IEBAIHZvaWQgV2ViUGFnZTo6ZW5kUHJpbnRp
bmcoKQogICAgIG1fcHJpbnRDb250ZXh0ID0gbnVsbHB0cjsKIH0KIAotdm9pZCBXZWJQYWdlOjpj
b21wdXRlUGFnZXNGb3JQcmludGluZyh1aW50NjRfdCBmcmFtZUlELCBjb25zdCBQcmludEluZm8m
IHByaW50SW5mbywgVmVjdG9yPEludFJlY3Q+JiByZXN1bHRQYWdlUmVjdHMsIGRvdWJsZSYgcmVz
dWx0VG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nKQordm9pZCBXZWJQYWdlOjpjb21wdXRlUGFn
ZXNGb3JQcmludGluZyh1aW50NjRfdCBmcmFtZUlELCBjb25zdCBQcmludEluZm8mIHByaW50SW5m
bywgdWludDY0X3QgY2FsbGJhY2tJRCkKIHsKLSAgICBiZWdpblByaW50aW5nKGZyYW1lSUQsIHBy
aW50SW5mbyk7CisgICAgVmVjdG9yPEludFJlY3Q+IHJlc3VsdFBhZ2VSZWN0czsKKyAgICBkb3Vi
bGUgcmVzdWx0VG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nOwogCiAgICAgV2ViRnJhbWUqIGZy
YW1lID0gV2ViUHJvY2Vzczo6c2hhcmVkKCkud2ViRnJhbWUoZnJhbWVJRCk7Ci0gICAgaWYgKCFm
cmFtZSkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChmcmFtZSAmJiBmcmFtZS0+Y29yZUZyYW1l
KCkpIHsKKyAgICAgICAgYmVnaW5QcmludGluZyhmcmFtZS0+Y29yZUZyYW1lKCksIHByaW50SW5m
byk7CiAKLSAgICBmbG9hdCBmdWxsUGFnZUhlaWdodDsKLSAgICBtX3ByaW50Q29udGV4dC0+Y29t
cHV0ZVBhZ2VSZWN0cyhGbG9hdFJlY3QoMCwgMCwgcHJpbnRJbmZvLmF2YWlsYWJsZVBhcGVyV2lk
dGgsIHByaW50SW5mby5hdmFpbGFibGVQYXBlckhlaWdodCksIDAsIDAsIHByaW50SW5mby5wYWdl
U2V0dXBTY2FsZUZhY3RvciwgZnVsbFBhZ2VIZWlnaHQsIHRydWUpOworICAgICAgICBmbG9hdCBm
dWxsUGFnZUhlaWdodDsKKyAgICAgICAgbV9wcmludENvbnRleHQtPmNvbXB1dGVQYWdlUmVjdHMo
RmxvYXRSZWN0KDAsIDAsIHByaW50SW5mby5hdmFpbGFibGVQYXBlcldpZHRoLCBwcmludEluZm8u
YXZhaWxhYmxlUGFwZXJIZWlnaHQpLCAwLCAwLCBwcmludEluZm8ucGFnZVNldHVwU2NhbGVGYWN0
b3IsIGZ1bGxQYWdlSGVpZ2h0LCB0cnVlKTsKIAotICAgIHJlc3VsdFRvdGFsU2NhbGVGYWN0b3JG
b3JQcmludGluZyA9IG1fcHJpbnRDb250ZXh0LT5jb21wdXRlQXV0b21hdGljU2NhbGVGYWN0b3Io
cHJpbnRJbmZvLmF2YWlsYWJsZVBhcGVyV2lkdGgpICogcHJpbnRJbmZvLnBhZ2VTZXR1cFNjYWxl
RmFjdG9yOwotICAgIHJlc3VsdFBhZ2VSZWN0cyA9IG1fcHJpbnRDb250ZXh0LT5wYWdlUmVjdHMo
KTsKKyAgICAgICAgcmVzdWx0UGFnZVJlY3RzID0gbV9wcmludENvbnRleHQtPnBhZ2VSZWN0cygp
OworICAgICAgICByZXN1bHRUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmcgPSBtX3ByaW50Q29u
dGV4dC0+Y29tcHV0ZUF1dG9tYXRpY1NjYWxlRmFjdG9yKHByaW50SW5mby5hdmFpbGFibGVQYXBl
cldpZHRoKSAqIHByaW50SW5mby5wYWdlU2V0dXBTY2FsZUZhY3RvcjsKKyAgICB9CiAKICAgICAv
LyBJZiB3ZSdyZSBhc2tlZCB0byBwcmludCwgd2Ugc2hvdWxkIGFjdHVhbGx5IHByaW50IGF0IGxl
YXN0IGEgYmxhbmsgcGFnZS4KICAgICBpZiAocmVzdWx0UGFnZVJlY3RzLmlzRW1wdHkoKSkKICAg
ICAgICAgcmVzdWx0UGFnZVJlY3RzLmFwcGVuZChJbnRSZWN0KDAsIDAsIDEsIDEpKTsKKworICAg
IHNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6Q29tcHV0ZWRQYWdlc0NhbGxiYWNrKHJlc3Vs
dFBhZ2VSZWN0cywgcmVzdWx0VG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nLCBjYWxsYmFja0lE
KSk7CiB9CiAKICNpZiBQTEFURk9STShNQUMpCiAvLyBGSVhNRTogRmluZCBhIGJldHRlciBwbGFj
ZSBmb3IgTWFjIHNwZWNpZmljIGNvZGUuCi12b2lkIFdlYlBhZ2U6OmRyYXdSZWN0VG9QREYodWlu
dDY0X3QgZnJhbWVJRCwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCwgVmVjdG9yPHVpbnQ4
X3Q+JiBwZGZEYXRhKQordm9pZCBXZWJQYWdlOjpkcmF3UmVjdFRvUERGKHVpbnQ2NF90IGZyYW1l
SUQsIGNvbnN0IFByaW50SW5mbyYgcHJpbnRJbmZvLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBy
ZWN0LCB1aW50NjRfdCBjYWxsYmFja0lEKQogewogICAgIFdlYkZyYW1lKiBmcmFtZSA9IFdlYlBy
b2Nlc3M6OnNoYXJlZCgpLndlYkZyYW1lKGZyYW1lSUQpOwotICAgIGlmICghZnJhbWUpCi0gICAg
ICAgIHJldHVybjsKKyAgICBGcmFtZSogY29yZUZyYW1lID0gZnJhbWUgPyBmcmFtZS0+Y29yZUZy
YW1lKCkgOiAwOwogCi0gICAgRnJhbWUqIGNvcmVGcmFtZSA9IGZyYW1lLT5jb3JlRnJhbWUoKTsK
LSAgICBpZiAoIWNvcmVGcmFtZSkKLSAgICAgICAgcmV0dXJuOworICAgIFJldGFpblB0cjxDRk11
dGFibGVEYXRhUmVmPiBwZGZQYWdlRGF0YShBZG9wdENGLCBDRkRhdGFDcmVhdGVNdXRhYmxlKDAs
IDApKTsKIAotICAgIEFTU0VSVChjb3JlRnJhbWUtPmRvY3VtZW50KCktPnByaW50aW5nKCkpOwor
ICAgIGlmIChjb3JlRnJhbWUpIHsKKyAgICAgICAgYmVnaW5QcmludGluZyhmcmFtZS0+Y29yZUZy
YW1lKCksIHByaW50SW5mbyk7CiAKLSAgICBSZXRhaW5QdHI8Q0ZNdXRhYmxlRGF0YVJlZj4gcGRm
UGFnZURhdGEoQWRvcHRDRiwgQ0ZEYXRhQ3JlYXRlTXV0YWJsZSgwLCAwKSk7CisgICAgICAgIC8v
IEZJWE1FOiBVc2UgQ0dEYXRhQ29uc3VtZXJDcmVhdGUgd2l0aCBjYWxsYmFja3MgdG8gYXZvaWQg
Y29weWluZyB0aGUgZGF0YS4KKyAgICAgICAgUmV0YWluUHRyPENHRGF0YUNvbnN1bWVyUmVmPiBw
ZGZEYXRhQ29uc3VtZXIoQWRvcHRDRiwgQ0dEYXRhQ29uc3VtZXJDcmVhdGVXaXRoQ0ZEYXRhKHBk
ZlBhZ2VEYXRhLmdldCgpKSk7CisKKyAgICAgICAgQ0dSZWN0IG1lZGlhQm94ID0gQ0dSZWN0TWFr
ZSgwLCAwLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgICAgICBSZXRhaW5QdHI8
Q0dDb250ZXh0UmVmPiBjb250ZXh0KEFkb3B0Q0YsIENHUERGQ29udGV4dENyZWF0ZShwZGZEYXRh
Q29uc3VtZXIuZ2V0KCksICZtZWRpYUJveCwgMCkpOworICAgICAgICBSZXRhaW5QdHI8Q0ZEaWN0
aW9uYXJ5UmVmPiBwYWdlSW5mbyhBZG9wdENGLCBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKDAs
IDAsICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVEaWN0aW9uYXJ5VmFs
dWVDYWxsQmFja3MpKTsKKyAgICAgICAgQ0dQREZDb250ZXh0QmVnaW5QYWdlKGNvbnRleHQuZ2V0
KCksIHBhZ2VJbmZvLmdldCgpKTsKKworICAgICAgICBHcmFwaGljc0NvbnRleHQgY3R4KGNvbnRl
eHQuZ2V0KCkpOworICAgICAgICBjdHguc2NhbGUoRmxvYXRTaXplKDEsIC0xKSk7CisgICAgICAg
IGN0eC50cmFuc2xhdGUoMCwgLXJlY3QuaGVpZ2h0KCkpOworICAgICAgICBtX3ByaW50Q29udGV4
dC0+c3Bvb2xSZWN0KGN0eCwgcmVjdCk7CisKKyAgICAgICAgQ0dQREZDb250ZXh0RW5kUGFnZShj
b250ZXh0LmdldCgpKTsKKyAgICAgICAgQ0dQREZDb250ZXh0Q2xvc2UoY29udGV4dC5nZXQoKSk7
CisgICAgfQorCisgICAgc2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpEYXRhQ2FsbGJhY2so
Q29yZUlQQzo6RGF0YVJlZmVyZW5jZShDRkRhdGFHZXRCeXRlUHRyKHBkZlBhZ2VEYXRhLmdldCgp
KSwgQ0ZEYXRhR2V0TGVuZ3RoKHBkZlBhZ2VEYXRhLmdldCgpKSksIGNhbGxiYWNrSUQpKTsKK30K
IAotICAgIC8vIEZJWE1FOiBVc2UgQ0dEYXRhQ29uc3VtZXJDcmVhdGUgd2l0aCBjYWxsYmFja3Mg
dG8gYXZvaWQgY29weWluZyB0aGUgZGF0YS4KLSAgICBSZXRhaW5QdHI8Q0dEYXRhQ29uc3VtZXJS
ZWY+IHBkZkRhdGFDb25zdW1lcihBZG9wdENGLCBDR0RhdGFDb25zdW1lckNyZWF0ZVdpdGhDRkRh
dGEocGRmUGFnZURhdGEuZ2V0KCkpKTsKK3ZvaWQgV2ViUGFnZTo6ZHJhd1BhZ2VzVG9QREYodWlu
dDY0X3QgZnJhbWVJRCwgY29uc3QgUHJpbnRJbmZvJiBwcmludEluZm8sIHVpbnQzMl90IGZpcnN0
LCB1aW50MzJfdCBjb3VudCwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICBXZWJGcmFtZSog
ZnJhbWUgPSBXZWJQcm9jZXNzOjpzaGFyZWQoKS53ZWJGcmFtZShmcmFtZUlEKTsKKyAgICBGcmFt
ZSogY29yZUZyYW1lID0gZnJhbWUgPyBmcmFtZS0+Y29yZUZyYW1lKCkgOiAwOworCisgICAgUmV0
YWluUHRyPENGTXV0YWJsZURhdGFSZWY+IHBkZlBhZ2VEYXRhKEFkb3B0Q0YsIENGRGF0YUNyZWF0
ZU11dGFibGUoMCwgMCkpOwogCi0gICAgQ0dSZWN0IG1lZGlhQm94ID0gQ0dSZWN0TWFrZSgwLCAw
LCBmcmFtZS0+c2l6ZSgpLndpZHRoKCksIGZyYW1lLT5zaXplKCkuaGVpZ2h0KCkpOwotICAgIFJl
dGFpblB0cjxDR0NvbnRleHRSZWY+IGNvbnRleHQoQWRvcHRDRiwgQ0dQREZDb250ZXh0Q3JlYXRl
KHBkZkRhdGFDb25zdW1lci5nZXQoKSwgJm1lZGlhQm94LCAwKSk7Ci0gICAgUmV0YWluUHRyPENG
RGljdGlvbmFyeVJlZj4gcGFnZUluZm8oQWRvcHRDRiwgQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJs
ZSgwLCAwLCAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFy
eVZhbHVlQ2FsbEJhY2tzKSk7Ci0gICAgQ0dQREZDb250ZXh0QmVnaW5QYWdlKGNvbnRleHQuZ2V0
KCksIHBhZ2VJbmZvLmdldCgpKTsKKyAgICBpZiAoY29yZUZyYW1lKSB7CisgICAgICAgIGJlZ2lu
UHJpbnRpbmcoZnJhbWUtPmNvcmVGcmFtZSgpLCBwcmludEluZm8pOwogCi0gICAgR3JhcGhpY3ND
b250ZXh0IGN0eChjb250ZXh0LmdldCgpKTsKLSAgICBtX3ByaW50Q29udGV4dC0+c3Bvb2xSZWN0
KGN0eCwgcmVjdCk7CisgICAgICAgIC8vIEZJWE1FOiBVc2UgQ0dEYXRhQ29uc3VtZXJDcmVhdGUg
d2l0aCBjYWxsYmFja3MgdG8gYXZvaWQgY29weWluZyB0aGUgZGF0YS4KKyAgICAgICAgUmV0YWlu
UHRyPENHRGF0YUNvbnN1bWVyUmVmPiBwZGZEYXRhQ29uc3VtZXIoQWRvcHRDRiwgQ0dEYXRhQ29u
c3VtZXJDcmVhdGVXaXRoQ0ZEYXRhKHBkZlBhZ2VEYXRhLmdldCgpKSk7CiAKLSAgICBDR1BERkNv
bnRleHRFbmRQYWdlKGNvbnRleHQuZ2V0KCkpOwotICAgIENHUERGQ29udGV4dENsb3NlKGNvbnRl
eHQuZ2V0KCkpOworICAgICAgICBDR1JlY3QgbWVkaWFCb3ggPSBtX3ByaW50Q29udGV4dC0+cGFn
ZVJlY3QoMCk7CisgICAgICAgIFJldGFpblB0cjxDR0NvbnRleHRSZWY+IGNvbnRleHQoQWRvcHRD
RiwgQ0dQREZDb250ZXh0Q3JlYXRlKHBkZkRhdGFDb25zdW1lci5nZXQoKSwgJm1lZGlhQm94LCAw
KSk7CisgICAgICAgIGZvciAodWludDMyX3QgcGFnZSA9IGZpcnN0OyBwYWdlIDwgZmlyc3QgKyBj
b3VudDsgKytwYWdlKSB7CisgICAgICAgICAgICBpZiAocGFnZSA+IG1fcHJpbnRDb250ZXh0LT5w
YWdlQ291bnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgUmV0YWlu
UHRyPENGRGljdGlvbmFyeVJlZj4gcGFnZUluZm8oQWRvcHRDRiwgQ0ZEaWN0aW9uYXJ5Q3JlYXRl
TXV0YWJsZSgwLCAwLCAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGlj
dGlvbmFyeVZhbHVlQ2FsbEJhY2tzKSk7CisgICAgICAgICAgICBDR1BERkNvbnRleHRCZWdpblBh
Z2UoY29udGV4dC5nZXQoKSwgcGFnZUluZm8uZ2V0KCkpOworCisgICAgICAgICAgICBHcmFwaGlj
c0NvbnRleHQgY3R4KGNvbnRleHQuZ2V0KCkpOworICAgICAgICAgICAgY3R4LnNjYWxlKEZsb2F0
U2l6ZSgxLCAtMSkpOworICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSgwLCAtbV9wcmludENvbnRl
eHQtPnBhZ2VSZWN0KHBhZ2UpLmhlaWdodCgpKTsKKyAgICAgICAgICAgIG1fcHJpbnRDb250ZXh0
LT5zcG9vbFBhZ2UoY3R4LCBwYWdlLCBtX3ByaW50Q29udGV4dC0+cGFnZVJlY3QocGFnZSkud2lk
dGgoKSk7CisKKyAgICAgICAgICAgIENHUERGQ29udGV4dEVuZFBhZ2UoY29udGV4dC5nZXQoKSk7
CisgICAgICAgIH0KKyAgICAgICAgQ0dQREZDb250ZXh0Q2xvc2UoY29udGV4dC5nZXQoKSk7Cisg
ICAgfQogCi0gICAgcGRmRGF0YS5yZXNpemUoQ0ZEYXRhR2V0TGVuZ3RoKHBkZlBhZ2VEYXRhLmdl
dCgpKSk7Ci0gICAgQ0ZEYXRhR2V0Qnl0ZXMocGRmUGFnZURhdGEuZ2V0KCksIENGUmFuZ2VNYWtl
KDAsIHBkZkRhdGEuc2l6ZSgpKSwgcGRmRGF0YS5kYXRhKCkpOworICAgIHNlbmQoTWVzc2FnZXM6
OldlYlBhZ2VQcm94eTo6RGF0YUNhbGxiYWNrKENvcmVJUEM6OkRhdGFSZWZlcmVuY2UoQ0ZEYXRh
R2V0Qnl0ZVB0cihwZGZQYWdlRGF0YS5nZXQoKSksIENGRGF0YUdldExlbmd0aChwZGZQYWdlRGF0
YS5nZXQoKSkpLCBjYWxsYmFja0lEKSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYktp
dDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCShyZXZpc2lvbiA3NjY1NCkKKysrIFNv
dXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTMwMywxMSArMzAzLDEyIEBAIHB1YmxpYzoKICAgICB2b2lkIHBlcmZvcm1EcmFnQ29udHJv
bGxlckFjdGlvbih1aW50NjRfdCBhY3Rpb24sIFdlYkNvcmU6OkludFBvaW50IGNsaWVudFBvc2l0
aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3QgZHJhZ2dpbmdT
b3VyY2VPcGVyYXRpb25NYXNrLCBjb25zdCBXVEY6OlN0cmluZyYgZHJhZ1N0b3JhZ2VOYW1lLCB1
aW50MzJfdCBmbGFncyk7CiAgICAgdm9pZCBkcmFnRW5kZWQoV2ViQ29yZTo6SW50UG9pbnQgY2xp
ZW50UG9zaXRpb24sIFdlYkNvcmU6OkludFBvaW50IGdsb2JhbFBvc2l0aW9uLCB1aW50NjRfdCBv
cGVyYXRpb24pOwogCi0gICAgdm9pZCBiZWdpblByaW50aW5nKHVpbnQ2NF90IGZyYW1lSUQsIGNv
bnN0IFByaW50SW5mbyYpOworICAgIHZvaWQgYmVnaW5QcmludGluZyhXZWJDb3JlOjpGcmFtZSos
IGNvbnN0IFByaW50SW5mbyYpOwogICAgIHZvaWQgZW5kUHJpbnRpbmcoKTsKLSAgICB2b2lkIGNv
bXB1dGVQYWdlc0ZvclByaW50aW5nKHVpbnQ2NF90IGZyYW1lSUQsIGNvbnN0IFByaW50SW5mbyYs
IFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiYgcmVzdWx0UGFnZVJlY3RzLCBkb3VibGUmIHJlc3Vs
dFRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZyk7CisgICAgdm9pZCBjb21wdXRlUGFnZXNGb3JQ
cmludGluZyh1aW50NjRfdCBmcmFtZUlELCBjb25zdCBQcmludEluZm8mLCB1aW50NjRfdCBjYWxs
YmFja0lEKTsKICNpZiBQTEFURk9STShNQUMpCi0gICAgdm9pZCBkcmF3UmVjdFRvUERGKHVpbnQ2
NF90IGZyYW1lSUQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBWZWN0b3I8dWludDhfdD4mIHBk
ZkRhdGEpOworICAgIHZvaWQgZHJhd1JlY3RUb1BERih1aW50NjRfdCBmcmFtZUlELCBjb25zdCBQ
cmludEluZm8mLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgdWludDY0X3QgY2FsbGJhY2tJRCk7
CisgICAgdm9pZCBkcmF3UGFnZXNUb1BERih1aW50NjRfdCBmcmFtZUlELCBjb25zdCBQcmludElu
Zm8mLCB1aW50MzJfdCBmaXJzdCwgdWludDMyX3QgY291bnQsIHVpbnQ2NF90IGNhbGxiYWNrSUQp
OwogI2VuZGlmCiAKICAgICBib29sIG1haW5GcmFtZUhhc0N1c3RvbVJlcHJlc2VudGF0aW9uKCkg
Y29uc3Q7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5t
ZXNzYWdlcy5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBh
Z2UvV2ViUGFnZS5tZXNzYWdlcy5pbgkocmV2aXNpb24gNzY2NTQpCisrKyBTb3VyY2UvV2ViS2l0
Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpA
QCAtMTM2LDExICsxMzYsMTEgQEAgbWVzc2FnZXMgLT4gV2ViUGFnZSB7CiAgICAgU2V0V2luZG93
UmVzaXplclNpemUoV2ViQ29yZTo6SW50U2l6ZSBpbnRlcnNlY3RzVmlldykKIAogICAgICMgUHJp
bnRpbmcuCi0gICAgQmVnaW5QcmludGluZyh1aW50NjRfdCBmcmFtZUlELCBXZWJLaXQ6OlByaW50
SW5mbyBwcmludEluZm8pOwogICAgIEVuZFByaW50aW5nKCk7Ci0gICAgQ29tcHV0ZVBhZ2VzRm9y
UHJpbnRpbmcodWludDY0X3QgZnJhbWVJRCwgV2ViS2l0OjpQcmludEluZm8gcHJpbnRJbmZvKSAt
PiAoVmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+IHBhZ2VSZWN0cywgZG91YmxlIHRvdGFsU2NhbGVG
YWN0b3JGb3JQcmludGluZykKKyAgICBDb21wdXRlUGFnZXNGb3JQcmludGluZyh1aW50NjRfdCBm
cmFtZUlELCBXZWJLaXQ6OlByaW50SW5mbyBwcmludEluZm8sIHVpbnQ2NF90IGNhbGxiYWNrSUQp
CiAjaWYgUExBVEZPUk0oTUFDKQotICAgIERyYXdSZWN0VG9QREYodWludDY0X3QgZnJhbWVJRCwg
V2ViQ29yZTo6SW50UmVjdCByZWN0KSAtPiAoVmVjdG9yPHVpbnQ4X3Q+IHBkZkRhdGEpCisgICAg
RHJhd1JlY3RUb1BERih1aW50NjRfdCBmcmFtZUlELCBXZWJLaXQ6OlByaW50SW5mbyBwcmludElu
Zm8sIFdlYkNvcmU6OkludFJlY3QgcmVjdCwgdWludDY0X3QgY2FsbGJhY2tJRCkKKyAgICBEcmF3
UGFnZXNUb1BERih1aW50NjRfdCBmcmFtZUlELCBXZWJLaXQ6OlByaW50SW5mbyBwcmludEluZm8s
IHVpbnQzMl90IGZpcnN0LCB1aW50MzJfdCBjb3VudCwgdWludDY0X3QgY2FsbGJhY2tJRCkKICNl
bmRpZgogCiAgICAgLy8gRklYTUU6IFRoaXMgYSBkdW1teSBtZXNzYWdlLCB0byBhdm9pZCBicmVh
a2luZyB0aGUgYnVpbGQgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHJlcXVpcmUK
</data>
<flag name="review"
          id="71718"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>