<?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>152478</bug_id>
          
          <creation_ts>2015-12-21 08:12:45 -0800</creation_ts>
          <short_desc>Optimize Air::TmpWidth analysis in IRC</short_desc>
          <delta_ts>2020-06-16 14:18:18 -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>JavaScriptCore</component>
          <version>WebKit 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>
          <dependson>152365</dependson>
          <blocked>154319</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Robin Morisset">rmorisset</assigned_to>
          <cc>benjamin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>rmorisset</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1150741</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-21 08:12:45 -0800</bug_when>
    <thetext>We can do this if we think that we need to reduce compile times further, but it doesn&apos;t currently appear to be a major bottleneck.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1533030</commentid>
    <comment_count>1</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2019-05-03 15:47:18 -0700</bug_when>
    <thetext>I just measured, and we only spend 0.6ms in TmpWidth::recompute() in all of JetStream2. So this is beyond negligible. Optimizing accesses to the TmpWidth on the other hand may still matter. But the computation itself is basically free.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1533041</commentid>
    <comment_count>2</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2019-05-03 16:04:32 -0700</bug_when>
    <thetext>I got the computation wrong: it is about 180ms and not 0.6ms (it seemed miraculous). Still a fairly small part of the register allocator (&gt; 3.5s).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1577493</commentid>
    <comment_count>3</comment_count>
      <attachid>380358</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2019-10-07 13:57:28 -0700</bug_when>
    <thetext>Created attachment 380358
Patch

Simple patch that optimizes AirTmpWidth, saving 100ms our of 3.4s in register allocation in JetStream2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655151</commentid>
    <comment_count>4</comment_count>
      <attachid>400000</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2020-05-21 16:54:49 -0700</bug_when>
    <thetext>Created attachment 400000
Patch

simple rebase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655190</commentid>
    <comment_count>5</comment_count>
      <attachid>400000</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-05-21 19:10:09 -0700</bug_when>
    <thetext>Comment on attachment 400000
Patch

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

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.cpp:66
&gt; +    widthsVector.clear();
&gt; +    widthsVector.resize(AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(code.numTmps(bank)));

I think this clear() may be unnecessary and not ideal as it can destroy the Vectors buffer. Since you are going to write to all values I the vector anyway, just resizing should be fine and could allow reuse of the underlying buffer,</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655366</commentid>
    <comment_count>6</comment_count>
      <attachid>400000</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-05-22 11:06:46 -0700</bug_when>
    <thetext>Comment on attachment 400000
Patch

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

Some comments and questions for now.  Also, the patch seems to need a rebase already.

&gt; Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp:2207
&gt; +    if (debug)

Why not use traceDebug instead?

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:57
&gt; -        auto iter = m_width.find(tmp);
&gt; -        if (iter == m_width.end())
&gt; -            return minimumWidth(Arg(tmp).bank());
&gt; -        return std::min(iter-&gt;value.use, iter-&gt;value.def);
&gt; +        Widths widths = getWidths(tmp);
&gt; +        return std::min(widths.use, widths.def);

Your implementation isn&apos;t equivalent.  The old code allows for the tmp to not be found.  In that case, this function returns minimumWidth(Arg(tmp).bank()).  In your case, you would return a result based on an uninitialized Widths in the vectors.  Also, is it possible to ask for a Widths for a tmp whose index is beyond the bounds of the current vector size?  That was not a problem with the old HashMap solution but may be for the vector.

Are you guaranteed that all the slows in the vector has been fully initialized before any of these accessors are called?  If so, can we assert this some how?

Ditto for the next few cases below.

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:98
&gt; +        Widths(Width useArg, Width defArg)
&gt; +        {
&gt; +            use = useArg;
&gt; +            def = defArg;
&gt; +        }

Why to use constructor initialization form?

    Widths(Width useArg, Width defArg)
        : use(useArg)
        , def(defArg)
    { }

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:106
&gt; +    Widths&amp; getWidths(Tmp tmp)

Webkit style is to name this &quot;widths&quot; instead.  We normally don&apos;t use &quot;get&quot; for accessors.

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:117
&gt; +    const Widths&amp; getWidths(Tmp tmp) const

Ditto.

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:126
&gt; +        if (tmp.isGP()) {
&gt; +            unsigned index = AbsoluteTmpMapper&lt;GP&gt;::absoluteIndex(tmp);
&gt; +            ASSERT(index &lt; m_widthGP.size());
&gt; +            return m_widthGP[index];
&gt; +        }
&gt; +        unsigned index = AbsoluteTmpMapper&lt;FP&gt;::absoluteIndex(tmp);
&gt; +        ASSERT(index &lt; m_widthFP.size());
&gt; +        return m_widthFP[index];

Just do this instead:
    return const_cast&lt;TmpWidth*&gt;(this)-&gt;widths(tmp);

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:142
&gt; +    Vector&lt;Widths&gt;&amp; getWidthsVector(Bank bank)

WebKit style: use widthsVector instead of getWidthsVector.

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:149
&gt; +    Vector&lt;Widths&gt; m_widthGP;

The minimumWidth for GP is Width8, which happens to be of value 0.  So, this might just works.

&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:150
&gt; +    Vector&lt;Widths&gt; m_widthFP;

The minimumWidth for FP is WidthFP, which happens to be of value 2.  So, this doesn&apos;t just work if not initialized.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1662942</commentid>
    <comment_count>7</comment_count>
      <attachid>400000</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2020-06-15 19:06:09 -0700</bug_when>
    <thetext>Comment on attachment 400000
Patch

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

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.cpp:66
&gt;&gt; +    widthsVector.resize(AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(code.numTmps(bank)));
&gt; 
&gt; I think this clear() may be unnecessary and not ideal as it can destroy the Vectors buffer. Since you are going to write to all values I the vector anyway, just resizing should be fine and could allow reuse of the underlying buffer,

Fixed.

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:57
&gt;&gt; +        return std::min(widths.use, widths.def);
&gt; 
&gt; Your implementation isn&apos;t equivalent.  The old code allows for the tmp to not be found.  In that case, this function returns minimumWidth(Arg(tmp).bank()).  In your case, you would return a result based on an uninitialized Widths in the vectors.  Also, is it possible to ask for a Widths for a tmp whose index is beyond the bounds of the current vector size?  That was not a problem with the old HashMap solution but may be for the vector.
&gt; 
&gt; Are you guaranteed that all the slows in the vector has been fully initialized before any of these accessors are called?  If so, can we assert this some how?
&gt; 
&gt; Ditto for the next few cases below.

The case of an index beyond the vector size is already covered by ASSERTs in getWidths.
As for the uninitialized case, it cannot happen as I initialize the vectors at the very beginning of recompute, which in turn is called in the constructor. Not sure how to ASSERT that we will always call recompute before accessing the data?

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:98
&gt;&gt; +        }
&gt; 
&gt; Why to use constructor initialization form?
&gt; 
&gt;     Widths(Width useArg, Width defArg)
&gt;         : use(useArg)
&gt;         , def(defArg)
&gt;     { }

Fixed.

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:106
&gt;&gt; +    Widths&amp; getWidths(Tmp tmp)
&gt; 
&gt; Webkit style is to name this &quot;widths&quot; instead.  We normally don&apos;t use &quot;get&quot; for accessors.

Fixed.

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:126
&gt;&gt; +        return m_widthFP[index];
&gt; 
&gt; Just do this instead:
&gt;     return const_cast&lt;TmpWidth*&gt;(this)-&gt;widths(tmp);

Thanks!

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:142
&gt;&gt; +    Vector&lt;Widths&gt;&amp; getWidthsVector(Bank bank)
&gt; 
&gt; WebKit style: use widthsVector instead of getWidthsVector.

Fixed.

&gt;&gt; Source/JavaScriptCore/b3/air/AirTmpWidth.h:149
&gt;&gt; +    Vector&lt;Widths&gt; m_widthGP;
&gt; 
&gt; The minimumWidth for GP is Width8, which happens to be of value 0.  So, this might just works.

Should I add a comment here that they are initialized in recompute, which is called in the constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1662943</commentid>
    <comment_count>8</comment_count>
      <attachid>401969</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2020-06-15 19:06:37 -0700</bug_when>
    <thetext>Created attachment 401969
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1663238</commentid>
    <comment_count>9</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-06-16 14:17:08 -0700</bug_when>
    <thetext>Committed r263116: &lt;https://trac.webkit.org/changeset/263116&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 401969.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1663239</commentid>
    <comment_count>10</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-06-16 14:18:18 -0700</bug_when>
    <thetext>&lt;rdar://problem/64421515&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>380358</attachid>
            <date>2019-10-07 13:57:28 -0700</date>
            <delta_ts>2020-05-21 16:54:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch152478</filename>
            <type>text/plain</type>
            <size>11955</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGI2ZGE3ZWM5MjY3Li4zN2RlNDI3ZjI3MSAxMDA2
NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTktMTAtMDcgIFJvYmlu
IE1vcmlzc2V0ICA8cm1vcmlzc2V0QGFwcGxlLmNvbT4KKworICAgICAgICBPcHRpbWl6ZSBBaXI6
OlRtcFdpZHRoIGFuYWx5c2lzIGluIElSQworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWlyVG1wV2lkdGggY3VycmVudGx5IHVzZXMgYSBIYXNoTWFwIHRv
IG1hcCB0bXBzIHRvIHRoZWlyIHdpZHRoLgorICAgICAgICBTaW5jZSB0bXBzIGhhdmUgY29uc2Vj
dXRpdmUgaW5kaWNlcywgd2UgY2FuIGluc3RlYWQgdXNlIHZlY3RvcnMgKG9uZSBmb3IgR1AgYW5k
IG9uZSBmb3IgRlAgdG1wcykuCisgICAgICAgIEFzIGEgYm9udXMsIHdlIGNhbiBqdXN0IGNvbXB1
dGUgdGhlIHdpZHRoIG9mIHRoZSB0bXBzIG9mIHRoZSBiYW5rIHRoZSByZWdpc3RlciBhbGxvY2F0
b3IgaXMgY3VycmVudGx5IGxvb2tpbmcgYXQuCisgICAgICAgIFRoaXMgY3V0cyB0aGUgdGltZSBz
cGVudCBpbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGluIEpldFN0cmVhbTIgYnkgYWJvdXQgMTAw
bXMgb3V0IG9mIDMuNHMKKyAgICAgICAgKG9yIHNvbWV0aW1lcyA4MG1zIG91dCBvZiAyLjQsIHRo
ZSBiaW1vZGFsaXR5IG9mIHRoZSB0aW1lIHNwZW50IGlzIGR1ZSB0byBhIGh1Z2UgZnVuY3Rpb24g
aW4gdGFnY2xvdWQtU1Agd2hpY2ggdXN1YWxseSBidXQgbm90IGFsd2F5cyByZWFjaCB0aGUgRlRM
LCBJJ2xsIGNoZWNrIGxhdGVyIGlmIGl0IGNhbiBiZSBmaXhlZCBieSB0d2Vha2luZyB0aGUgaW5s
aW5lcikuCisKKyAgICAgICAgKiBiMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29s
b3JpbmcuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjphbGxvY2F0ZVJlZ2lzdGVyc0J5R3Jh
cGhDb2xvcmluZyk6CisgICAgICAgICogYjMvYWlyL0FpclRtcFdpZHRoLmNwcDoKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OlRtcFdpZHRoKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6VG1wV2lkdGg6OnJlY29tcHV0ZSk6CisgICAgICAgICogYjMvYWlyL0FpclRtcFdpZHRoLmg6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjp3aWR0aCBjb25zdCk6CisgICAgICAg
IChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjpyZXF1aXJlZFdpZHRoKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6VG1wV2lkdGg6OmRlZldpZHRoIGNvbnN0KToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6VG1wV2lkdGg6OnVzZVdpZHRoIGNvbnN0KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1w
V2lkdGg6OldpZHRoczo6V2lkdGhzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6
OmdldFdpZHRocyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjpnZXRXaWR0aHMg
Y29uc3QpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpUbXBXaWR0aDo6YWRkV2lkdGhzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OmdldFdpZHRoc1ZlY3Rvcik6CisKIDIwMTkt
MTAtMDcgIE1hdHQgTGV3aXMgIDxqbGV3aXMzQGFwcGxlLmNvbT4KIAogICAgICAgICBVbnJldmll
d2VkLCByb2xsaW5nIG91dCByMjUwNzUwLgpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9y
aW5nLmNwcAppbmRleCAwODYwNjhhY2M2Mi4uZTBjNmQyMGVhODUgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3Jp
bmcuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVSZWdp
c3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwCkBAIC0xODQwLDcgKzE4NDAsNyBAQCBwcml2YXRlOgog
ICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBUbXBXaWR0aCBvdmVyaGVh
ZCBpcyBmcm9tIHF1ZXJpZXMgb2YgVG1wV2lkdGggcmF0aGVyIHRoYW4gdGhlCiAgICAgICAgICAg
ICAvLyByZWNvbXB1dGF0aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVkaW5nIHVwIHRoZSBsb29rdXAg
d291bGQgYmUgYSBiaWdnZXIgd2luLgogICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjQ3OAotICAgICAgICAgICAgbV90bXBXaWR0aC5yZWNv
bXB1dGUobV9jb2RlKTsKKyAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlPGJhbms+KG1f
Y29kZSk7CiAKICAgICAgICAgICAgIGF1dG8gZG9BbGxvY2F0aW9uID0gWyZdIChhdXRvJiBhbGxv
Y2F0b3IpIC0+IGJvb2wgewogICAgICAgICAgICAgICAgIGFsbG9jYXRvci5hbGxvY2F0ZSgpOwpA
QCAtMjIwNSw3ICsyMjA1LDcgQEAgdm9pZCBhbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmlu
ZyhDb2RlJiBjb2RlKQogewogICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAiYWxsb2Nh
dGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmciKTsKICAgICAKLSAgICBpZiAoZmFsc2UpCisgICAg
aWYgKGRlYnVnKQogICAgICAgICBkYXRhTG9nKCJDb2RlIGJlZm9yZSBncmFwaCBjb2xvcmluZzpc
biIsIGNvZGUpOwogCiAgICAgVXNlQ291bnRzPFRtcD4gdXNlQ291bnRzKGNvZGUpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBXaWR0aC5jcHAgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFdpZHRoLmNwcAppbmRleCA3YWU3ZTJmZDhm
NC4uZTg2MDQyMDc0MTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyVG1wV2lkdGguY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1w
V2lkdGguY3BwCkBAIC00MCwxMyArNDAsMTUgQEAgVG1wV2lkdGg6OlRtcFdpZHRoKCkKIAogVG1w
V2lkdGg6OlRtcFdpZHRoKENvZGUmIGNvZGUpCiB7Ci0gICAgcmVjb21wdXRlKGNvZGUpOworICAg
IHJlY29tcHV0ZTxHUD4oY29kZSk7CisgICAgcmVjb21wdXRlPEZQPihjb2RlKTsKIH0KIAogVG1w
V2lkdGg6On5UbXBXaWR0aCgpCiB7CiB9CiAKK3RlbXBsYXRlIDxCYW5rIGJhbms+CiB2b2lkIFRt
cFdpZHRoOjpyZWNvbXB1dGUoQ29kZSYgY29kZSkKIHsKICAgICAvLyBTZXQgdGhpcyB0byB0cnVl
IHRvIGNhdXNlIHRoaXMgYW5hbHlzaXMgdG8gYWx3YXlzIHJldHVybiBwZXNzaW1pc3RpYyByZXN1
bHRzLgpAQCAtNTUsMTcgKzU3LDIxIEBAIHZvaWQgVG1wV2lkdGg6OnJlY29tcHV0ZShDb2RlJiBj
b2RlKQogICAgIGNvbnN0IGJvb2wgdmVyYm9zZSA9IGZhbHNlOwogCiAgICAgaWYgKHZlcmJvc2Up
IHsKLSAgICAgICAgZGF0YUxvZygiQ29kZSBiZWZvcmUgVG1wV2lkdGg6XG4iKTsKKyAgICAgICAg
ZGF0YUxvZ0xuKCJDb2RlIGJlZm9yZSBUbXBXaWR0aDoiKTsKICAgICAgICAgZGF0YUxvZyhjb2Rl
KTsKICAgICB9Ci0gICAgCi0gICAgbV93aWR0aC5jbGVhcigpOworCisgICAgYXV0byYgd2lkdGhz
VmVjdG9yID0gZ2V0V2lkdGhzVmVjdG9yKGJhbmspOworICAgIHdpZHRoc1ZlY3Rvci5jbGVhcigp
OworICAgIHdpZHRoc1ZlY3Rvci5yZXNpemUoQWJzb2x1dGVUbXBNYXBwZXI8YmFuaz46OmFic29s
dXRlSW5kZXgoY29kZS5udW1UbXBzKGJhbmspKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHdpZHRoc1ZlY3Rvci5zaXplKCk7ICsraSkKKyAgICAgICAgd2lkdGhzVmVjdG9yW2ldID0g
V2lkdGhzKGJhbmspOwogICAgIAogICAgIGF1dG8gYXNzdW1lVGhlV29yc3QgPSBbJl0gKFRtcCB0
bXApIHsKLSAgICAgICAgV2lkdGhzJiB3aWR0aHMgPSBtX3dpZHRoLmFkZCh0bXAsIFdpZHRocygp
KS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgICAgIEJhbmsgYmFuayA9IEFyZyh0bXApLmJhbmsoKTsK
LSAgICAgICAgd2lkdGhzLnVzZSA9IGNvbnNlcnZhdGl2ZVdpZHRoKGJhbmspOwotICAgICAgICB3
aWR0aHMuZGVmID0gY29uc2VydmF0aXZlV2lkdGgoYmFuayk7CisgICAgICAgIGlmIChiYW5rID09
IEFyZyh0bXApLmJhbmsoKSkgeworICAgICAgICAgICAgV2lkdGggY29uc2VydmF0aXZlID0gY29u
c2VydmF0aXZlV2lkdGgoYmFuayk7CisgICAgICAgICAgICBhZGRXaWR0aHModG1wLCB7IGNvbnNl
cnZhdGl2ZSwgY29uc2VydmF0aXZlIH0pOworICAgICAgICB9CiAgICAgfTsKICAgICAKICAgICAv
LyBBc3N1bWUgdGhlIHdvcnN0IGZvciByZWdpc3RlcnMuCkBAIC04OSwyMCArOTUsMTYgQEAgdm9p
ZCBUbXBXaWR0aDo6cmVjb21wdXRlKENvZGUmIGNvZGUpCiAgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IGNvZGUpIHsKICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CiAgICAg
ICAgICAgICBpZiAoaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlICYmIGluc3QuYXJnc1sxXS5pc1Rt
cCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZyhpbnN0LmFyZ3NbMV0pLmJhbmsoKSAhPSBi
YW5rKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgIGlm
IChpbnN0LmFyZ3NbMF0uaXNUbXAoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1
cmUgdGhhdCBib3RoIHNpZGVzIG9mIHRoZSBNb3ZlIGhhdmUgYSB3aWR0aCBhbHJlYWR5IGluaXRp
YWxpemVkLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZml4cG9pbnQgYmVsb3cgYXNzdW1l
cyB0aGF0IGl0IG5ldmVyIGhhcyB0byBhZGQgdGhpbmdzIHRvIHRoZSBIYXNoTWFwLgotICAgICAg
ICAgICAgICAgICAgICBtX3dpZHRoLmFkZChpbnN0LmFyZ3NbMF0udG1wKCksIFdpZHRocyhHUCkp
OwotICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZChpbnN0LmFyZ3NbMV0udG1wKCksIFdp
ZHRocyhHUCkpOwotICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgbW92
ZXMuYXBwZW5kKCZpbnN0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbnN0LmFyZ3NbMF0uaXNJbW0oKQotICAg
ICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0udmFsdWUoKSA+PSAwKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGluc3QuYXJnc1swXS5pc0ltbSgpICYmIGluc3QuYXJnc1swXS52YWx1ZSgp
ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgVG1wIHRtcCA9IGluc3QuYXJnc1sxXS50bXAo
KTsKLSAgICAgICAgICAgICAgICAgICAgV2lkdGhzJiB3aWR0aHMgPSBtX3dpZHRoLmFkZCh0bXAs
IFdpZHRocyhHUCkpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgIFdpZHRocyYgd2lkdGhzID0gZ2V0V2lkdGhzKHRtcCk7CiAgICAgICAg
ICAgICAgICAgICAgIGlmIChpbnN0LmFyZ3NbMF0udmFsdWUoKSA8PSBzdGQ6Om51bWVyaWNfbGlt
aXRzPGludDhfdD46Om1heCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLmRlZiA9
IHN0ZDo6bWF4KHdpZHRocy5kZWYsIFdpZHRoOCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2Ug
aWYgKGluc3QuYXJnc1swXS52YWx1ZSgpIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46
Om1heCgpKQpAQCAtMTE2LDE2ICsxMTgsMTggQEAgdm9pZCBUbXBXaWR0aDo6cmVjb21wdXRlKENv
ZGUmIGNvZGUpCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAg
aW5zdC5mb3JFYWNoVG1wKAotICAgICAgICAgICAgICAgIFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9s
ZSByb2xlLCBCYW5rIGJhbmssIFdpZHRoIHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdp
ZHRocyYgd2lkdGhzID0gbV93aWR0aC5hZGQodG1wLCBXaWR0aHMoYmFuaykpLml0ZXJhdG9yLT52
YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgWyZdIChUbXAmIHRt
cCwgQXJnOjpSb2xlIHJvbGUsIEJhbmsgdG1wQmFuaywgV2lkdGggd2lkdGgpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKEFyZyh0bXApLmJhbmsoKSAhPSBiYW5rKQorICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIFdpZHRocyYgd2lkdGhzID0g
Z2V0V2lkdGhzKHRtcCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55VXNlKHJv
bGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLnVzZSA9IHN0ZDo6bWF4KHdpZHRo
cy51c2UsIHdpZHRoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc1pEZWYocm9s
ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMuZGVmID0gc3RkOjptYXgod2lkdGhz
LmRlZiwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmc6OmlzQW55RGVm
KHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLmRlZiA9IGNvbnNlcnZhdGl2
ZVdpZHRoKGJhbmspOworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLmRlZiA9IGNvbnNl
cnZhdGl2ZVdpZHRoKHRtcEJhbmspOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAg
ICAgfQpAQCAtMTM5LDEyICsxNDMsOCBAQCB2b2lkIFRtcFdpZHRoOjpyZWNvbXB1dGUoQ29kZSYg
Y29kZSkKICAgICAgICAgICAgIEFTU0VSVChtb3ZlLT5hcmdzWzBdLmlzVG1wKCkpOwogICAgICAg
ICAgICAgQVNTRVJUKG1vdmUtPmFyZ3NbMV0uaXNUbXAoKSk7CiAKLSAgICAgICAgICAgIC8vIFdl
IGFscmVhZHkgZW5zdXJlIHRoYXQgYm90aCB0bXBzIGFyZSBhZGRlZCB0byB0aGUgd2lkdGggbWFw
LiBUaGF0J3MgaW1wb3J0YW50Ci0gICAgICAgICAgICAvLyBiZWNhdXNlIHlvdSBjYW5ub3QgYWRk
IGJvdGggdG1wcyBoZXJlIHdoaWxlIHNpbXVsdGFuZW91c2x5IGdldHRpbmcgYSByZWZlcmVuY2Ug
dG8KLSAgICAgICAgICAgIC8vIHRoZWlyIHZhbHVlcywgc2luY2UgdGhlIHNlY29uZCBhZGQgd291
bGQgaW52YWxpZGF0ZSB0aGUgcmVmZXJlbmNlIHJldHVybmVkIGJ5IHRoZQotICAgICAgICAgICAg
Ly8gZmlyc3Qgb25lLgotICAgICAgICAgICAgV2lkdGhzJiBzcmNXaWR0aHMgPSBtX3dpZHRoLmZp
bmQobW92ZS0+YXJnc1swXS50bXAoKSktPnZhbHVlOwotICAgICAgICAgICAgV2lkdGhzJiBkc3RX
aWR0aHMgPSBtX3dpZHRoLmZpbmQobW92ZS0+YXJnc1sxXS50bXAoKSktPnZhbHVlOworICAgICAg
ICAgICAgV2lkdGhzJiBzcmNXaWR0aHMgPSBnZXRXaWR0aHMobW92ZS0+YXJnc1swXS50bXAoKSk7
CisgICAgICAgICAgICBXaWR0aHMmIGRzdFdpZHRocyA9IGdldFdpZHRocyhtb3ZlLT5hcmdzWzFd
LnRtcCgpKTsKIAogICAgICAgICAgICAgLy8gTGVnZW5kOgogICAgICAgICAgICAgLy8KQEAgLTE2
OCw4ICsxNjgsMTEgQEAgdm9pZCBUbXBXaWR0aDo6cmVjb21wdXRlKENvZGUmIGNvZGUpCiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgZGF0YUxvZygid2lkdGg6
ICIsIG1hcER1bXAobV93aWR0aCksICJcbiIpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAg
IGRhdGFMb2dMbigiYmFuazogIiwgYmFuaywgIiwgd2lkdGhzVmVjdG9yOiAiKTsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdpZHRoc1ZlY3Rvci5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgIGRhdGFMb2dMbigiXHQiLCBpLCAiIDogIiwgd2lkdGhzVmVjdG9yW2ldKTsKKyAgICB9
CiB9CiAKIHZvaWQgVG1wV2lkdGg6OldpZHRoczo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dApkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBXaWR0aC5o
IGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBXaWR0aC5oCmluZGV4IGIyM2Iz
MjcyYTAyLi5lNmU0YTc4NzBhYyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJUbXBXaWR0aC5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
VG1wV2lkdGguaApAQCAtMzksNiArMzksNyBAQCBwdWJsaWM6CiAgICAgVG1wV2lkdGgoQ29kZSYp
OwogICAgIH5UbXBXaWR0aCgpOwogCisgICAgdGVtcGxhdGUgPEJhbmsgYmFuaz4KICAgICB2b2lk
IHJlY29tcHV0ZShDb2RlJik7CiAKICAgICAvLyBUaGUgd2lkdGggb2YgYSBUbXAgaXMgdGhlIG51
bWJlciBvZiBiaXRzIHRoYXQgeW91IG5lZWQgdG8gYmUgYWJsZSB0byB0cmFjayB3aXRob3V0IHNv
bWUgdHJpdmlhbApAQCAtNTIsMTkgKzUzLDE1IEBAIHB1YmxpYzoKICAgICAvLyBtZXRob2RzLgog
ICAgIFdpZHRoIHdpZHRoKFRtcCB0bXApIGNvbnN0CiAgICAgewotICAgICAgICBhdXRvIGl0ZXIg
PSBtX3dpZHRoLmZpbmQodG1wKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gbV93aWR0aC5lbmQoKSkK
LSAgICAgICAgICAgIHJldHVybiBtaW5pbXVtV2lkdGgoQXJnKHRtcCkuYmFuaygpKTsKLSAgICAg
ICAgcmV0dXJuIHN0ZDo6bWluKGl0ZXItPnZhbHVlLnVzZSwgaXRlci0+dmFsdWUuZGVmKTsKKyAg
ICAgICAgV2lkdGhzIHdpZHRocyA9IGdldFdpZHRocyh0bXApOworICAgICAgICByZXR1cm4gc3Rk
OjptaW4od2lkdGhzLnVzZSwgd2lkdGhzLmRlZik7CiAgICAgfQogCiAgICAgLy8gUmV0dXJuIHRo
ZSBtaW5pbXVtIHJlcXVpcmVkIHdpZHRoIGZvciBhbGwgZGVmcy91c2VzIG9mIHRoaXMgVG1wLgog
ICAgIFdpZHRoIHJlcXVpcmVkV2lkdGgoVG1wIHRtcCkKICAgICB7Ci0gICAgICAgIGF1dG8gaXRl
ciA9IG1fd2lkdGguZmluZCh0bXApOwotICAgICAgICBpZiAoaXRlciA9PSBtX3dpZHRoLmVuZCgp
KQotICAgICAgICAgICAgcmV0dXJuIG1pbmltdW1XaWR0aChBcmcodG1wKS5iYW5rKCkpOwotICAg
ICAgICByZXR1cm4gc3RkOjptYXgoaXRlci0+dmFsdWUudXNlLCBpdGVyLT52YWx1ZS5kZWYpOwor
ICAgICAgICBXaWR0aHMgd2lkdGhzID0gZ2V0V2lkdGhzKHRtcCk7CisgICAgICAgIHJldHVybiBz
dGQ6Om1heCh3aWR0aHMudXNlLCB3aWR0aHMuZGVmKTsKICAgICB9CiAKICAgICAvLyBUaGlzIGlu
ZGlyZWN0bHkgdGVsbHMgeW91IGhvdyBtdWNoIG9mIHRoZSB0bXAncyBoaWdoIGJpdHMgYXJlIGd1
YXJhbnRlZWQgdG8gYmUgemVyby4gVGhlIG51bWJlciBvZgpAQCAtNzUsMTkgKzcyLDEzIEBAIHB1
YmxpYzoKICAgICAvLyBXaGVyZSBUb3RhbEJpdHMgYXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0
cyBpbiB0aGUgcmVnaXN0ZXIsIHNvIDY0IG9uIGEgNjQtYml0IHN5c3RlbS4KICAgICBXaWR0aCBk
ZWZXaWR0aChUbXAgdG1wKSBjb25zdAogICAgIHsKLSAgICAgICAgYXV0byBpdGVyID0gbV93aWR0
aC5maW5kKHRtcCk7Ci0gICAgICAgIGlmIChpdGVyID09IG1fd2lkdGguZW5kKCkpCi0gICAgICAg
ICAgICByZXR1cm4gbWluaW11bVdpZHRoKEFyZyh0bXApLmJhbmsoKSk7Ci0gICAgICAgIHJldHVy
biBpdGVyLT52YWx1ZS5kZWY7CisgICAgICAgIHJldHVybiBnZXRXaWR0aHModG1wKS5kZWY7CiAg
ICAgfQogCiAgICAgLy8gVGhpcyB0ZWxscyB5b3UgaG93IG11Y2ggb2YgVG1wIGlzIGdvaW5nIHRv
IGJlIHJlYWQuCiAgICAgV2lkdGggdXNlV2lkdGgoVG1wIHRtcCkgY29uc3QKICAgICB7Ci0gICAg
ICAgIGF1dG8gaXRlciA9IG1fd2lkdGguZmluZCh0bXApOwotICAgICAgICBpZiAoaXRlciA9PSBt
X3dpZHRoLmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIG1pbmltdW1XaWR0aChBcmcodG1wKS5i
YW5rKCkpOwotICAgICAgICByZXR1cm4gaXRlci0+dmFsdWUudXNlOworICAgICAgICByZXR1cm4g
Z2V0V2lkdGhzKHRtcCkudXNlOwogICAgIH0KICAgICAKIHByaXZhdGU6CkBAIC0xMDAsMTMgKzkx
LDYzIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBkZWYgPSBtaW5pbXVtV2lkdGgoYmFuayk7CiAg
ICAgICAgIH0KIAorICAgICAgICBXaWR0aHMoV2lkdGggdXNlQXJnLCBXaWR0aCBkZWZBcmcpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIHVzZSA9IHVzZUFyZzsKKyAgICAgICAgICAgIGRlZiA9IGRl
ZkFyZzsKKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdDsKICAgICAgICAgCiAgICAgICAgIFdpZHRoIHVzZTsKICAgICAgICAgV2lkdGggZGVmOwog
ICAgIH07Ci0gICAgCi0gICAgSGFzaE1hcDxUbXAsIFdpZHRocz4gbV93aWR0aDsKKworICAgIFdp
ZHRocyYgZ2V0V2lkdGhzKFRtcCB0bXApCisgICAgeworICAgICAgICBpZiAodG1wLmlzR1AoKSkg
eworICAgICAgICAgICAgdW5zaWduZWQgaW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjxHUD46OmFi
c29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgICAgIEFTU0VSVChpbmRleCA8IG1fd2lkdGhHUC5z
aXplKCkpOworICAgICAgICAgICAgcmV0dXJuIG1fd2lkdGhHUFtpbmRleF07CisgICAgICAgIH0K
KyAgICAgICAgdW5zaWduZWQgaW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjxGUD46OmFic29sdXRl
SW5kZXgodG1wKTsKKyAgICAgICAgQVNTRVJUKGluZGV4IDwgbV93aWR0aEZQLnNpemUoKSk7Cisg
ICAgICAgIHJldHVybiBtX3dpZHRoRlBbaW5kZXhdOworICAgIH0KKyAgICBjb25zdCBXaWR0aHMm
IGdldFdpZHRocyhUbXAgdG1wKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHRtcC5pc0dQKCkp
IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8R1A+Ojph
YnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgICAgICBBU1NFUlQoaW5kZXggPCBtX3dpZHRoR1Au
c2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtX3dpZHRoR1BbaW5kZXhdOworICAgICAgICB9
CisgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8RlA+OjphYnNvbHV0
ZUluZGV4KHRtcCk7CisgICAgICAgIEFTU0VSVChpbmRleCA8IG1fd2lkdGhGUC5zaXplKCkpOwor
ICAgICAgICByZXR1cm4gbV93aWR0aEZQW2luZGV4XTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFdp
ZHRocyhUbXAgdG1wLCBXaWR0aHMgd2lkdGhzKQorICAgIHsKKyAgICAgICAgaWYgKHRtcC5pc0dQ
KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8R1A+
OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgICAgICBBU1NFUlQoaW5kZXggPCBtX3dpZHRo
R1Auc2l6ZSgpKTsKKyAgICAgICAgICAgIG1fd2lkdGhHUFtpbmRleF0gPSB3aWR0aHM7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCA9IEFic29sdXRlVG1wTWFw
cGVyPEZQPjo6YWJzb2x1dGVJbmRleCh0bXApOworICAgICAgICAgICAgQVNTRVJUKGluZGV4IDwg
bV93aWR0aEZQLnNpemUoKSk7CisgICAgICAgICAgICBtX3dpZHRoRlBbaW5kZXhdID0gd2lkdGhz
OworICAgICAgICB9CisgICAgfQorCisgICAgVmVjdG9yPFdpZHRocz4mIGdldFdpZHRoc1ZlY3Rv
cihCYW5rIGJhbmspCisgICAgeworICAgICAgICBpZiAoYmFuayA9PSBHUCkKKyAgICAgICAgICAg
IHJldHVybiBtX3dpZHRoR1A7CisgICAgICAgIHJldHVybiBtX3dpZHRoRlA7CisgICAgfQorCisg
ICAgVmVjdG9yPFdpZHRocz4gbV93aWR0aEdQOworICAgIFZlY3RvcjxXaWR0aHM+IG1fd2lkdGhG
UDsKIH07CiAKIH0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>400000</attachid>
            <date>2020-05-21 16:54:49 -0700</date>
            <delta_ts>2020-06-15 19:06:37 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch152478</filename>
            <type>text/plain</type>
            <size>11992</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGEwOWQwZWUwNDhmLi42ZDU0Nzk2MDk4MyAxMDA2
NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzIgQEAKKzIwMjAtMDUtMjEgIFJvYmlu
IE1vcmlzc2V0ICA8cm1vcmlzc2V0QGFwcGxlLmNvbT4KKworICAgICAgICBPcHRpbWl6ZSBBaXI6
OlRtcFdpZHRoIGFuYWx5c2lzIGluIElSQworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWlyVG1wV2lkdGggY3VycmVudGx5IHVzZXMgYSBIYXNoTWFwIHRv
IG1hcCB0bXBzIHRvIHRoZWlyIHdpZHRoLgorICAgICAgICBTaW5jZSB0bXBzIGhhdmUgY29uc2Vj
dXRpdmUgaW5kaWNlcywgd2UgY2FuIGluc3RlYWQgdXNlIHZlY3RvcnMgKG9uZSBmb3IgR1AgYW5k
IG9uZSBmb3IgRlAgdG1wcykuCisgICAgICAgIEFzIGEgYm9udXMsIHdlIGNhbiBqdXN0IGNvbXB1
dGUgdGhlIHdpZHRoIG9mIHRoZSB0bXBzIG9mIHRoZSBiYW5rIHRoZSByZWdpc3RlciBhbGxvY2F0
b3IgaXMgY3VycmVudGx5IGxvb2tpbmcgYXQuCisgICAgICAgIFRoaXMgY3V0cyB0aGUgdGltZSBz
cGVudCBpbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGluIEpldFN0cmVhbTIgYnkgYWJvdXQgMTAw
bXMgb3V0IG9mIDMuNHMKKyAgICAgICAgKG9yIHNvbWV0aW1lcyA4MG1zIG91dCBvZiAyLjQsIHRo
ZSBiaW1vZGFsaXR5IG9mIHRoZSB0aW1lIHNwZW50IGlzIGR1ZSB0byBhIGh1Z2UgZnVuY3Rpb24g
aW4gdGFnY2xvdWQtU1Agd2hpY2ggdXN1YWxseSBidXQgbm90IGFsd2F5cyByZWFjaCB0aGUgRlRM
LCBJJ2xsIGNoZWNrIGxhdGVyIGlmIGl0IGNhbiBiZSBmaXhlZCBieSB0d2Vha2luZyB0aGUgaW5s
aW5lcikuCisKKyAgICAgICAgKiBiMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29s
b3JpbmcuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjphbGxvY2F0ZVJlZ2lzdGVyc0J5R3Jh
cGhDb2xvcmluZyk6CisgICAgICAgICogYjMvYWlyL0FpclRtcFdpZHRoLmNwcDoKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OlRtcFdpZHRoKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6VG1wV2lkdGg6OnJlY29tcHV0ZSk6CisgICAgICAgICogYjMvYWlyL0FpclRtcFdpZHRoLmg6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjp3aWR0aCBjb25zdCk6CisgICAgICAg
IChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjpyZXF1aXJlZFdpZHRoKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6VG1wV2lkdGg6OmRlZldpZHRoIGNvbnN0KToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6VG1wV2lkdGg6OnVzZVdpZHRoIGNvbnN0KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1w
V2lkdGg6OldpZHRoczo6V2lkdGhzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6
OmdldFdpZHRocyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjpnZXRXaWR0aHMg
Y29uc3QpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpUbXBXaWR0aDo6YWRkV2lkdGhzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OmdldFdpZHRoc1ZlY3Rvcik6CisKIDIwMjAt
MDUtMjEgIEFsZXhleSBTaHZheWthICA8c2h2YWlrYWxlc2hAZ21haWwuY29tPgogCiAgICAgICAg
IFVzZSBAaXNVbmRlZmluZWRPck51bGwgaW5zdGVhZCBvZiBhYnN0cmFjdCBlcXVhbGl0eSB3aXRo
IG51bGwKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2Nh
dGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAKaW5kZXggYTFjODQz
ZDVhNDQuLmRhNWNhZmI1ZTVkIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nLmNwcAorKysgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5n
LmNwcApAQCAtMTgzOSw3ICsxODM5LDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIC8vIHBvc3Np
YmxlIHRoYXQgbW9zdCBvZiB0aGUgVG1wV2lkdGggb3ZlcmhlYWQgaXMgZnJvbSBxdWVyaWVzIG9m
IFRtcFdpZHRoIHJhdGhlciB0aGFuIHRoZQogICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiwg
aW4gd2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdvdWxkIGJlIGEgYmlnZ2VyIHdp
bi4KICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNTI0NzgKLSAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlKG1fY29kZSk7CisgICAg
ICAgICAgICBtX3RtcFdpZHRoLnJlY29tcHV0ZTxiYW5rPihtX2NvZGUpOwogCiAgICAgICAgICAg
ICBhdXRvIGRvQWxsb2NhdGlvbiA9IFsmXSAoYXV0byYgYWxsb2NhdG9yKSAtPiBib29sIHsKICAg
ICAgICAgICAgICAgICBhbGxvY2F0b3IuYWxsb2NhdGUoKTsKQEAgLTIyMDQsNyArMjIwNCw3IEBA
IHZvaWQgYWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcoQ29kZSYgY29kZSkKIHsKICAg
ICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUoY29kZSwgImFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENv
bG9yaW5nIik7CiAgICAgCi0gICAgaWYgKGZhbHNlKQorICAgIGlmIChkZWJ1ZykKICAgICAgICAg
ZGF0YUxvZygiQ29kZSBiZWZvcmUgZ3JhcGggY29sb3Jpbmc6XG4iLCBjb2RlKTsKIAogICAgIFVz
ZUNvdW50czxUbXA+IHVzZUNvdW50cyhjb2RlKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJUbXBXaWR0aC5jcHAKaW5kZXggN2FlN2UyZmQ4ZjQuLmU4NjA0MjA3NDE0IDEwMDY0
NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFdpZHRoLmNwcAorKysg
Yi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFdpZHRoLmNwcApAQCAtNDAsMTMg
KzQwLDE1IEBAIFRtcFdpZHRoOjpUbXBXaWR0aCgpCiAKIFRtcFdpZHRoOjpUbXBXaWR0aChDb2Rl
JiBjb2RlKQogewotICAgIHJlY29tcHV0ZShjb2RlKTsKKyAgICByZWNvbXB1dGU8R1A+KGNvZGUp
OworICAgIHJlY29tcHV0ZTxGUD4oY29kZSk7CiB9CiAKIFRtcFdpZHRoOjp+VG1wV2lkdGgoKQog
ewogfQogCit0ZW1wbGF0ZSA8QmFuayBiYW5rPgogdm9pZCBUbXBXaWR0aDo6cmVjb21wdXRlKENv
ZGUmIGNvZGUpCiB7CiAgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBjYXVzZSB0aGlzIGFuYWx5
c2lzIHRvIGFsd2F5cyByZXR1cm4gcGVzc2ltaXN0aWMgcmVzdWx0cy4KQEAgLTU1LDE3ICs1Nywy
MSBAQCB2b2lkIFRtcFdpZHRoOjpyZWNvbXB1dGUoQ29kZSYgY29kZSkKICAgICBjb25zdCBib29s
IHZlcmJvc2UgPSBmYWxzZTsKIAogICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIGRhdGFMb2co
IkNvZGUgYmVmb3JlIFRtcFdpZHRoOlxuIik7CisgICAgICAgIGRhdGFMb2dMbigiQ29kZSBiZWZv
cmUgVG1wV2lkdGg6Iik7CiAgICAgICAgIGRhdGFMb2coY29kZSk7CiAgICAgfQotICAgIAotICAg
IG1fd2lkdGguY2xlYXIoKTsKKworICAgIGF1dG8mIHdpZHRoc1ZlY3RvciA9IGdldFdpZHRoc1Zl
Y3RvcihiYW5rKTsKKyAgICB3aWR0aHNWZWN0b3IuY2xlYXIoKTsKKyAgICB3aWR0aHNWZWN0b3Iu
cmVzaXplKEFic29sdXRlVG1wTWFwcGVyPGJhbms+OjphYnNvbHV0ZUluZGV4KGNvZGUubnVtVG1w
cyhiYW5rKSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB3aWR0aHNWZWN0b3Iuc2l6
ZSgpOyArK2kpCisgICAgICAgIHdpZHRoc1ZlY3RvcltpXSA9IFdpZHRocyhiYW5rKTsKICAgICAK
ICAgICBhdXRvIGFzc3VtZVRoZVdvcnN0ID0gWyZdIChUbXAgdG1wKSB7Ci0gICAgICAgIFdpZHRo
cyYgd2lkdGhzID0gbV93aWR0aC5hZGQodG1wLCBXaWR0aHMoKSkuaXRlcmF0b3ItPnZhbHVlOwot
ICAgICAgICBCYW5rIGJhbmsgPSBBcmcodG1wKS5iYW5rKCk7Ci0gICAgICAgIHdpZHRocy51c2Ug
PSBjb25zZXJ2YXRpdmVXaWR0aChiYW5rKTsKLSAgICAgICAgd2lkdGhzLmRlZiA9IGNvbnNlcnZh
dGl2ZVdpZHRoKGJhbmspOworICAgICAgICBpZiAoYmFuayA9PSBBcmcodG1wKS5iYW5rKCkpIHsK
KyAgICAgICAgICAgIFdpZHRoIGNvbnNlcnZhdGl2ZSA9IGNvbnNlcnZhdGl2ZVdpZHRoKGJhbmsp
OworICAgICAgICAgICAgYWRkV2lkdGhzKHRtcCwgeyBjb25zZXJ2YXRpdmUsIGNvbnNlcnZhdGl2
ZSB9KTsKKyAgICAgICAgfQogICAgIH07CiAgICAgCiAgICAgLy8gQXNzdW1lIHRoZSB3b3JzdCBm
b3IgcmVnaXN0ZXJzLgpAQCAtODksMjAgKzk1LDE2IEBAIHZvaWQgVG1wV2lkdGg6OnJlY29tcHV0
ZShDb2RlJiBjb2RlKQogICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7CiAgICAg
ICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgewogICAgICAgICAgICAgaWYgKGluc3Qua2lu
ZC5vcGNvZGUgPT0gTW92ZSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKSkgeworICAgICAgICAgICAg
ICAgIGlmIChBcmcoaW5zdC5hcmdzWzFdKS5iYW5rKCkgIT0gYmFuaykKKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICBpZiAoaW5zdC5hcmdzWzBdLmlzVG1w
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYm90aCBzaWRlcyBv
ZiB0aGUgTW92ZSBoYXZlIGEgd2lkdGggYWxyZWFkeSBpbml0aWFsaXplZC4gVGhlCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGZpeHBvaW50IGJlbG93IGFzc3VtZXMgdGhhdCBpdCBuZXZlciBoYXMg
dG8gYWRkIHRoaW5ncyB0byB0aGUgSGFzaE1hcC4KLSAgICAgICAgICAgICAgICAgICAgbV93aWR0
aC5hZGQoaW5zdC5hcmdzWzBdLnRtcCgpLCBXaWR0aHMoR1ApKTsKLSAgICAgICAgICAgICAgICAg
ICAgbV93aWR0aC5hZGQoaW5zdC5hcmdzWzFdLnRtcCgpLCBXaWR0aHMoR1ApKTsKLSAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIG1vdmVzLmFwcGVuZCgmaW5zdCk7CiAg
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBpZiAoaW5zdC5hcmdzWzBdLmlzSW1tKCkKLSAgICAgICAgICAgICAgICAgICAgJiYg
aW5zdC5hcmdzWzBdLnZhbHVlKCkgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpbnN0LmFy
Z3NbMF0uaXNJbW0oKSAmJiBpbnN0LmFyZ3NbMF0udmFsdWUoKSA+PSAwKSB7CiAgICAgICAgICAg
ICAgICAgICAgIFRtcCB0bXAgPSBpbnN0LmFyZ3NbMV0udG1wKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIFdpZHRocyYgd2lkdGhzID0gbV93aWR0aC5hZGQodG1wLCBXaWR0aHMoR1ApKS5pdGVyYXRv
ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBXaWR0
aHMmIHdpZHRocyA9IGdldFdpZHRocyh0bXApOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5z
dC5hcmdzWzBdLnZhbHVlKCkgPD0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgoKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocy5kZWYgPSBzdGQ6Om1heCh3aWR0aHMuZGVm
LCBXaWR0aDgpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0LmFyZ3NbMF0udmFs
dWUoKSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSkKQEAgLTExNiwxNiAr
MTE4LDE4IEBAIHZvaWQgVG1wV2lkdGg6OnJlY29tcHV0ZShDb2RlJiBjb2RlKQogICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcCgKLSAg
ICAgICAgICAgICAgICBbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBX
aWR0aCB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICBXaWR0aHMmIHdpZHRocyA9IG1fd2lk
dGguYWRkKHRtcCwgV2lkdGhzKGJhbmspKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBC
YW5rIHRtcEJhbmssIFdpZHRoIHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBcmco
dG1wKS5iYW5rKCkgIT0gYmFuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICAgICAgICAgICAgICBXaWR0aHMmIHdpZHRocyA9IGdldFdpZHRocyh0bXApOwogICAg
ICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgIHdpZHRocy51c2UgPSBzdGQ6Om1heCh3aWR0aHMudXNlLCB3aWR0aCk7CiAKICAg
ICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNaRGVmKHJvbGUpKQogICAgICAgICAgICAgICAg
ICAgICAgICAgd2lkdGhzLmRlZiA9IHN0ZDo6bWF4KHdpZHRocy5kZWYsIHdpZHRoKTsKICAgICAg
ICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJnOjppc0FueURlZihyb2xlKSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHdpZHRocy5kZWYgPSBjb25zZXJ2YXRpdmVXaWR0aChiYW5rKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHdpZHRocy5kZWYgPSBjb25zZXJ2YXRpdmVXaWR0aCh0bXBCYW5r
KTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzOSwxMiArMTQz
LDggQEAgdm9pZCBUbXBXaWR0aDo6cmVjb21wdXRlKENvZGUmIGNvZGUpCiAgICAgICAgICAgICBB
U1NFUlQobW92ZS0+YXJnc1swXS5pc1RtcCgpKTsKICAgICAgICAgICAgIEFTU0VSVChtb3ZlLT5h
cmdzWzFdLmlzVG1wKCkpOwogCi0gICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGVuc3VyZSB0aGF0
IGJvdGggdG1wcyBhcmUgYWRkZWQgdG8gdGhlIHdpZHRoIG1hcC4gVGhhdCdzIGltcG9ydGFudAot
ICAgICAgICAgICAgLy8gYmVjYXVzZSB5b3UgY2Fubm90IGFkZCBib3RoIHRtcHMgaGVyZSB3aGls
ZSBzaW11bHRhbmVvdXNseSBnZXR0aW5nIGEgcmVmZXJlbmNlIHRvCi0gICAgICAgICAgICAvLyB0
aGVpciB2YWx1ZXMsIHNpbmNlIHRoZSBzZWNvbmQgYWRkIHdvdWxkIGludmFsaWRhdGUgdGhlIHJl
ZmVyZW5jZSByZXR1cm5lZCBieSB0aGUKLSAgICAgICAgICAgIC8vIGZpcnN0IG9uZS4KLSAgICAg
ICAgICAgIFdpZHRocyYgc3JjV2lkdGhzID0gbV93aWR0aC5maW5kKG1vdmUtPmFyZ3NbMF0udG1w
KCkpLT52YWx1ZTsKLSAgICAgICAgICAgIFdpZHRocyYgZHN0V2lkdGhzID0gbV93aWR0aC5maW5k
KG1vdmUtPmFyZ3NbMV0udG1wKCkpLT52YWx1ZTsKKyAgICAgICAgICAgIFdpZHRocyYgc3JjV2lk
dGhzID0gZ2V0V2lkdGhzKG1vdmUtPmFyZ3NbMF0udG1wKCkpOworICAgICAgICAgICAgV2lkdGhz
JiBkc3RXaWR0aHMgPSBnZXRXaWR0aHMobW92ZS0+YXJnc1sxXS50bXAoKSk7CiAKICAgICAgICAg
ICAgIC8vIExlZ2VuZDoKICAgICAgICAgICAgIC8vCkBAIC0xNjgsOCArMTY4LDExIEBAIHZvaWQg
VG1wV2lkdGg6OnJlY29tcHV0ZShDb2RlJiBjb2RlKQogICAgICAgICB9CiAgICAgfQogCi0gICAg
aWYgKHZlcmJvc2UpCi0gICAgICAgIGRhdGFMb2coIndpZHRoOiAiLCBtYXBEdW1wKG1fd2lkdGgp
LCAiXG4iKTsKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBkYXRhTG9nTG4oImJhbms6ICIs
IGJhbmssICIsIHdpZHRoc1ZlY3RvcjogIik7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCB3aWR0aHNWZWN0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlx0
IiwgaSwgIiA6ICIsIHdpZHRoc1ZlY3RvcltpXSk7CisgICAgfQogfQogCiB2b2lkIFRtcFdpZHRo
OjpXaWR0aHM6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguaCBiL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguaAppbmRleCBiMjNiMzI3MmEwMi4uZTZlNGE3ODcwYWMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguaAor
KysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFdpZHRoLmgKQEAgLTM5LDYg
KzM5LDcgQEAgcHVibGljOgogICAgIFRtcFdpZHRoKENvZGUmKTsKICAgICB+VG1wV2lkdGgoKTsK
IAorICAgIHRlbXBsYXRlIDxCYW5rIGJhbms+CiAgICAgdm9pZCByZWNvbXB1dGUoQ29kZSYpOwog
CiAgICAgLy8gVGhlIHdpZHRoIG9mIGEgVG1wIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHlv
dSBuZWVkIHRvIGJlIGFibGUgdG8gdHJhY2sgd2l0aG91dCBzb21lIHRyaXZpYWwKQEAgLTUyLDE5
ICs1MywxNSBAQCBwdWJsaWM6CiAgICAgLy8gbWV0aG9kcy4KICAgICBXaWR0aCB3aWR0aChUbXAg
dG1wKSBjb25zdAogICAgIHsKLSAgICAgICAgYXV0byBpdGVyID0gbV93aWR0aC5maW5kKHRtcCk7
Ci0gICAgICAgIGlmIChpdGVyID09IG1fd2lkdGguZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4g
bWluaW11bVdpZHRoKEFyZyh0bXApLmJhbmsoKSk7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1pbihp
dGVyLT52YWx1ZS51c2UsIGl0ZXItPnZhbHVlLmRlZik7CisgICAgICAgIFdpZHRocyB3aWR0aHMg
PSBnZXRXaWR0aHModG1wKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWluKHdpZHRocy51c2UsIHdp
ZHRocy5kZWYpOwogICAgIH0KIAogICAgIC8vIFJldHVybiB0aGUgbWluaW11bSByZXF1aXJlZCB3
aWR0aCBmb3IgYWxsIGRlZnMvdXNlcyBvZiB0aGlzIFRtcC4KICAgICBXaWR0aCByZXF1aXJlZFdp
ZHRoKFRtcCB0bXApCiAgICAgewotICAgICAgICBhdXRvIGl0ZXIgPSBtX3dpZHRoLmZpbmQodG1w
KTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gbV93aWR0aC5lbmQoKSkKLSAgICAgICAgICAgIHJldHVy
biBtaW5pbXVtV2lkdGgoQXJnKHRtcCkuYmFuaygpKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4
KGl0ZXItPnZhbHVlLnVzZSwgaXRlci0+dmFsdWUuZGVmKTsKKyAgICAgICAgV2lkdGhzIHdpZHRo
cyA9IGdldFdpZHRocyh0bXApOworICAgICAgICByZXR1cm4gc3RkOjptYXgod2lkdGhzLnVzZSwg
d2lkdGhzLmRlZik7CiAgICAgfQogCiAgICAgLy8gVGhpcyBpbmRpcmVjdGx5IHRlbGxzIHlvdSBo
b3cgbXVjaCBvZiB0aGUgdG1wJ3MgaGlnaCBiaXRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIHplcm8u
IFRoZSBudW1iZXIgb2YKQEAgLTc1LDE5ICs3MiwxMyBAQCBwdWJsaWM6CiAgICAgLy8gV2hlcmUg
VG90YWxCaXRzIGFyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHJlZ2lzdGVyLCBz
byA2NCBvbiBhIDY0LWJpdCBzeXN0ZW0uCiAgICAgV2lkdGggZGVmV2lkdGgoVG1wIHRtcCkgY29u
c3QKICAgICB7Ci0gICAgICAgIGF1dG8gaXRlciA9IG1fd2lkdGguZmluZCh0bXApOwotICAgICAg
ICBpZiAoaXRlciA9PSBtX3dpZHRoLmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIG1pbmltdW1X
aWR0aChBcmcodG1wKS5iYW5rKCkpOwotICAgICAgICByZXR1cm4gaXRlci0+dmFsdWUuZGVmOwor
ICAgICAgICByZXR1cm4gZ2V0V2lkdGhzKHRtcCkuZGVmOwogICAgIH0KIAogICAgIC8vIFRoaXMg
dGVsbHMgeW91IGhvdyBtdWNoIG9mIFRtcCBpcyBnb2luZyB0byBiZSByZWFkLgogICAgIFdpZHRo
IHVzZVdpZHRoKFRtcCB0bXApIGNvbnN0CiAgICAgewotICAgICAgICBhdXRvIGl0ZXIgPSBtX3dp
ZHRoLmZpbmQodG1wKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gbV93aWR0aC5lbmQoKSkKLSAgICAg
ICAgICAgIHJldHVybiBtaW5pbXVtV2lkdGgoQXJnKHRtcCkuYmFuaygpKTsKLSAgICAgICAgcmV0
dXJuIGl0ZXItPnZhbHVlLnVzZTsKKyAgICAgICAgcmV0dXJuIGdldFdpZHRocyh0bXApLnVzZTsK
ICAgICB9CiAgICAgCiBwcml2YXRlOgpAQCAtMTAwLDEzICs5MSw2MyBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgZGVmID0gbWluaW11bVdpZHRoKGJhbmspOwogICAgICAgICB9CiAKKyAgICAgICAg
V2lkdGhzKFdpZHRoIHVzZUFyZywgV2lkdGggZGVmQXJnKQorICAgICAgICB7CisgICAgICAgICAg
ICB1c2UgPSB1c2VBcmc7CisgICAgICAgICAgICBkZWYgPSBkZWZBcmc7CisgICAgICAgIH0KKwog
ICAgICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CiAgICAgICAgIAogICAg
ICAgICBXaWR0aCB1c2U7CiAgICAgICAgIFdpZHRoIGRlZjsKICAgICB9OwotICAgIAotICAgIEhh
c2hNYXA8VG1wLCBXaWR0aHM+IG1fd2lkdGg7CisKKyAgICBXaWR0aHMmIGdldFdpZHRocyhUbXAg
dG1wKQorICAgIHsKKyAgICAgICAgaWYgKHRtcC5pc0dQKCkpIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIGluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8R1A+OjphYnNvbHV0ZUluZGV4KHRtcCk7Cisg
ICAgICAgICAgICBBU1NFUlQoaW5kZXggPCBtX3dpZHRoR1Auc2l6ZSgpKTsKKyAgICAgICAgICAg
IHJldHVybiBtX3dpZHRoR1BbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGlu
ZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8RlA+OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAg
IEFTU0VSVChpbmRleCA8IG1fd2lkdGhGUC5zaXplKCkpOworICAgICAgICByZXR1cm4gbV93aWR0
aEZQW2luZGV4XTsKKyAgICB9CisgICAgY29uc3QgV2lkdGhzJiBnZXRXaWR0aHMoVG1wIHRtcCkg
Y29uc3QKKyAgICB7CisgICAgICAgIGlmICh0bXAuaXNHUCgpKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBpbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPEdQPjo6YWJzb2x1dGVJbmRleCh0bXApOwor
ICAgICAgICAgICAgQVNTRVJUKGluZGV4IDwgbV93aWR0aEdQLnNpemUoKSk7CisgICAgICAgICAg
ICByZXR1cm4gbV93aWR0aEdQW2luZGV4XTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBp
bmRleCA9IEFic29sdXRlVG1wTWFwcGVyPEZQPjo6YWJzb2x1dGVJbmRleCh0bXApOworICAgICAg
ICBBU1NFUlQoaW5kZXggPCBtX3dpZHRoRlAuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIG1fd2lk
dGhGUFtpbmRleF07CisgICAgfQorCisgICAgdm9pZCBhZGRXaWR0aHMoVG1wIHRtcCwgV2lkdGhz
IHdpZHRocykKKyAgICB7CisgICAgICAgIGlmICh0bXAuaXNHUCgpKSB7CisgICAgICAgICAgICB1
bnNpZ25lZCBpbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPEdQPjo6YWJzb2x1dGVJbmRleCh0bXAp
OworICAgICAgICAgICAgQVNTRVJUKGluZGV4IDwgbV93aWR0aEdQLnNpemUoKSk7CisgICAgICAg
ICAgICBtX3dpZHRoR1BbaW5kZXhdID0gd2lkdGhzOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgdW5zaWduZWQgaW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjxGUD46OmFic29sdXRlSW5k
ZXgodG1wKTsKKyAgICAgICAgICAgIEFTU0VSVChpbmRleCA8IG1fd2lkdGhGUC5zaXplKCkpOwor
ICAgICAgICAgICAgbV93aWR0aEZQW2luZGV4XSA9IHdpZHRoczsKKyAgICAgICAgfQorICAgIH0K
KworICAgIFZlY3RvcjxXaWR0aHM+JiBnZXRXaWR0aHNWZWN0b3IoQmFuayBiYW5rKQorICAgIHsK
KyAgICAgICAgaWYgKGJhbmsgPT0gR1ApCisgICAgICAgICAgICByZXR1cm4gbV93aWR0aEdQOwor
ICAgICAgICByZXR1cm4gbV93aWR0aEZQOworICAgIH0KKworICAgIFZlY3RvcjxXaWR0aHM+IG1f
d2lkdGhHUDsKKyAgICBWZWN0b3I8V2lkdGhzPiBtX3dpZHRoRlA7CiB9OwogCiB9IH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMzo6QWlyCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>401969</attachid>
            <date>2020-06-15 19:06:37 -0700</date>
            <delta_ts>2020-06-16 14:17:08 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch152478</filename>
            <type>text/plain</type>
            <size>12373</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGNlNWZmZTE1NjRiNi4uYjIxYmZkZDZlNDI0IDEw
MDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMiBAQAorMjAyMC0wNi0xNSAgUm9i
aW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUuY29tPgorCisgICAgICAgIE9wdGltaXplIEFp
cjo6VG1wV2lkdGggYW5hbHlzaXMgaW4gSVJDCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBaXJUbXBXaWR0aCBjdXJyZW50bHkgdXNlcyBhIEhhc2hNYXAg
dG8gbWFwIHRtcHMgdG8gdGhlaXIgd2lkdGguCisgICAgICAgIFNpbmNlIHRtcHMgaGF2ZSBjb25z
ZWN1dGl2ZSBpbmRpY2VzLCB3ZSBjYW4gaW5zdGVhZCB1c2UgdmVjdG9ycyAob25lIGZvciBHUCBh
bmQgb25lIGZvciBGUCB0bXBzKS4KKyAgICAgICAgQXMgYSBib251cywgd2UgY2FuIGp1c3QgY29t
cHV0ZSB0aGUgd2lkdGggb2YgdGhlIHRtcHMgb2YgdGhlIGJhbmsgdGhlIHJlZ2lzdGVyIGFsbG9j
YXRvciBpcyBjdXJyZW50bHkgbG9va2luZyBhdC4KKyAgICAgICAgVGhpcyBjdXRzIHRoZSB0aW1l
IHNwZW50IGluIHRoZSByZWdpc3RlciBhbGxvY2F0b3IgaW4gSmV0U3RyZWFtMiBieSBhYm91dCAx
MDBtcyBvdXQgb2YgMy40cworICAgICAgICAob3Igc29tZXRpbWVzIDgwbXMgb3V0IG9mIDIuNCwg
dGhlIGJpbW9kYWxpdHkgb2YgdGhlIHRpbWUgc3BlbnQgaXMgZHVlIHRvIGEgaHVnZSBmdW5jdGlv
biBpbiB0YWdjbG91ZC1TUCB3aGljaCB1c3VhbGx5IGJ1dCBub3QgYWx3YXlzIHJlYWNoIHRoZSBG
VEwsIEknbGwgY2hlY2sgbGF0ZXIgaWYgaXQgY2FuIGJlIGZpeGVkIGJ5IHR3ZWFraW5nIHRoZSBp
bmxpbmVyKS4KKworICAgICAgICAqIGIzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhD
b2xvcmluZy5jcHA6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OmFsbG9jYXRlUmVnaXN0ZXJzQnlH
cmFwaENvbG9yaW5nKToKKyAgICAgICAgKiBiMy9haXIvQWlyVG1wV2lkdGguY3BwOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpUbXBXaWR0aDo6VG1wV2lkdGgpOgorICAgICAgICAoSlNDOjpCMzo6
QWlyOjpUbXBXaWR0aDo6cmVjb21wdXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlyVG1wV2lkdGgu
aDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OndpZHRoIGNvbnN0KToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OnJlcXVpcmVkV2lkdGgpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpUbXBXaWR0aDo6ZGVmV2lkdGggY29uc3QpOgorICAgICAgICAoSlNDOjpCMzo6
QWlyOjpUbXBXaWR0aDo6dXNlV2lkdGggY29uc3QpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpU
bXBXaWR0aDo6V2lkdGhzOjpXaWR0aHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpUbXBXaWR0
aDo6d2lkdGhzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wV2lkdGg6OndpZHRocyBjb25z
dCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlRtcFdpZHRoOjphZGRXaWR0aHMpOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpUbXBXaWR0aDo6d2lkdGhzVmVjdG9yKToKKwogMjAyMC0wNi0xNSAg
TWFyayBMYW0gIDxtYXJrLmxhbUBhcHBsZS5jb20+CiAKICAgICAgICAgRG8gbm90IGluc3RhbGwg
dGhlIFZNVHJhcHMgc2lnbmFsIGhhbmRsZXIgaWYgT3B0aW9uczo6dXNlSklUPWZhbHNlLgpkaWZm
IC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVy
c0J5R3JhcGhDb2xvcmluZy5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFs
bG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nLmNwcAppbmRleCA5YzFiMTE0OTM2ZTQuLjRh
MTliMWY1MzhkMyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJB
bGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAKKysrIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAKQEAg
LTE4MzksNyArMTgzOSw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAvLyBwb3NzaWJsZSB0aGF0
IG1vc3Qgb2YgdGhlIFRtcFdpZHRoIG92ZXJoZWFkIGlzIGZyb20gcXVlcmllcyBvZiBUbXBXaWR0
aCByYXRoZXIgdGhhbiB0aGUKICAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24sIGluIHdoaWNo
IGNhc2Ugc3BlZWRpbmcgdXAgdGhlIGxvb2t1cCB3b3VsZCBiZSBhIGJpZ2dlciB3aW4uCiAgICAg
ICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDc4
Ci0gICAgICAgICAgICBtX3RtcFdpZHRoLnJlY29tcHV0ZShtX2NvZGUpOworICAgICAgICAgICAg
bV90bXBXaWR0aC5yZWNvbXB1dGU8YmFuaz4obV9jb2RlKTsKIAogICAgICAgICAgICAgYXV0byBk
b0FsbG9jYXRpb24gPSBbJl0gKGF1dG8mIGFsbG9jYXRvcikgLT4gYm9vbCB7CiAgICAgICAgICAg
ICAgICAgYWxsb2NhdG9yLmFsbG9jYXRlKCk7CkBAIC0yMjA0LDcgKzIyMDQsNyBAQCB2b2lkIGFs
bG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nKENvZGUmIGNvZGUpCiB7CiAgICAgUGhhc2VT
Y29wZSBwaGFzZVNjb3BlKGNvZGUsICJhbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZyIp
OwogICAgIAotICAgIGlmIChmYWxzZSkKKyAgICBpZiAodHJhY2VEZWJ1ZykKICAgICAgICAgZGF0
YUxvZygiQ29kZSBiZWZvcmUgZ3JhcGggY29sb3Jpbmc6XG4iLCBjb2RlKTsKIAogICAgIFVzZUNv
dW50czxUbXA+IHVzZUNvdW50cyhjb2RlKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJUbXBXaWR0aC5jcHAKaW5kZXggYjdiM2JiYmIyZDRmLi40MzgyZjA3NDk2NzMgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguY3BwCisrKyBi
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguY3BwCkBAIC00MCwzMiAr
NDAsMzYgQEAgVG1wV2lkdGg6OlRtcFdpZHRoKCkKIAogVG1wV2lkdGg6OlRtcFdpZHRoKENvZGUm
IGNvZGUpCiB7Ci0gICAgcmVjb21wdXRlKGNvZGUpOworICAgIHJlY29tcHV0ZTxHUD4oY29kZSk7
CisgICAgcmVjb21wdXRlPEZQPihjb2RlKTsKIH0KIAogVG1wV2lkdGg6On5UbXBXaWR0aCgpCiB7
CiB9CiAKK3RlbXBsYXRlIDxCYW5rIGJhbms+CiB2b2lkIFRtcFdpZHRoOjpyZWNvbXB1dGUoQ29k
ZSYgY29kZSkKIHsKICAgICAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGNhdXNlIHRoaXMgYW5hbHlz
aXMgdG8gYWx3YXlzIHJldHVybiBwZXNzaW1pc3RpYyByZXN1bHRzLgotICAgIGNvbnN0IGJvb2wg
YmVDYXJlZnVsID0gZmFsc2U7Ci0KKyAgICBjb25zdGV4cHIgYm9vbCBiZUNhcmVmdWwgPSBmYWxz
ZTsKICAgICBjb25zdGV4cHIgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAKICAgICBpZiAodmVyYm9z
ZSkgewotICAgICAgICBkYXRhTG9nKCJDb2RlIGJlZm9yZSBUbXBXaWR0aDpcbiIpOworICAgICAg
ICBkYXRhTG9nTG4oIkNvZGUgYmVmb3JlIFRtcFdpZHRoOiIpOwogICAgICAgICBkYXRhTG9nKGNv
ZGUpOwogICAgIH0KLSAgICAKLSAgICBtX3dpZHRoLmNsZWFyKCk7CisKKyAgICBhdXRvJiBiYW5r
V2lkdGhzVmVjdG9yID0gd2lkdGhzVmVjdG9yKGJhbmspOworICAgIGJhbmtXaWR0aHNWZWN0b3Iu
cmVzaXplKEFic29sdXRlVG1wTWFwcGVyPGJhbms+OjphYnNvbHV0ZUluZGV4KGNvZGUubnVtVG1w
cyhiYW5rKSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBiYW5rV2lkdGhzVmVjdG9y
LnNpemUoKTsgKytpKQorICAgICAgICBiYW5rV2lkdGhzVmVjdG9yW2ldID0gV2lkdGhzKGJhbmsp
OwogICAgIAogICAgIGF1dG8gYXNzdW1lVGhlV29yc3QgPSBbJl0gKFRtcCB0bXApIHsKLSAgICAg
ICAgV2lkdGhzJiB3aWR0aHMgPSBtX3dpZHRoLmFkZCh0bXAsIFdpZHRocygpKS5pdGVyYXRvci0+
dmFsdWU7Ci0gICAgICAgIEJhbmsgYmFuayA9IEFyZyh0bXApLmJhbmsoKTsKLSAgICAgICAgd2lk
dGhzLnVzZSA9IGNvbnNlcnZhdGl2ZVdpZHRoKGJhbmspOwotICAgICAgICB3aWR0aHMuZGVmID0g
Y29uc2VydmF0aXZlV2lkdGgoYmFuayk7CisgICAgICAgIGlmIChiYW5rID09IEFyZyh0bXApLmJh
bmsoKSkgeworICAgICAgICAgICAgV2lkdGggY29uc2VydmF0aXZlID0gY29uc2VydmF0aXZlV2lk
dGgoYmFuayk7CisgICAgICAgICAgICBhZGRXaWR0aHModG1wLCB7IGNvbnNlcnZhdGl2ZSwgY29u
c2VydmF0aXZlIH0pOworICAgICAgICB9CiAgICAgfTsKICAgICAKICAgICAvLyBBc3N1bWUgdGhl
IHdvcnN0IGZvciByZWdpc3RlcnMuCkBAIC04OSw0MyArOTMsNDIgQEAgdm9pZCBUbXBXaWR0aDo6
cmVjb21wdXRlKENvZGUmIGNvZGUpCiAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNvZGUp
IHsKICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CiAgICAgICAgICAgICBpZiAo
aW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlICYmIGluc3QuYXJnc1sxXS5pc1RtcCgpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKEFyZyhpbnN0LmFyZ3NbMV0pLmJhbmsoKSAhPSBiYW5rKQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgIGlmIChpbnN0LmFyZ3Nb
MF0uaXNUbXAoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBib3Ro
IHNpZGVzIG9mIHRoZSBNb3ZlIGhhdmUgYSB3aWR0aCBhbHJlYWR5IGluaXRpYWxpemVkLiBUaGUK
LSAgICAgICAgICAgICAgICAgICAgLy8gZml4cG9pbnQgYmVsb3cgYXNzdW1lcyB0aGF0IGl0IG5l
dmVyIGhhcyB0byBhZGQgdGhpbmdzIHRvIHRoZSBIYXNoTWFwLgotICAgICAgICAgICAgICAgICAg
ICBtX3dpZHRoLmFkZChpbnN0LmFyZ3NbMF0udG1wKCksIFdpZHRocyhHUCkpOwotICAgICAgICAg
ICAgICAgICAgICBtX3dpZHRoLmFkZChpbnN0LmFyZ3NbMV0udG1wKCksIFdpZHRocyhHUCkpOwot
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgbW92ZXMuYXBwZW5kKCZp
bnN0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIGlmIChpbnN0LmFyZ3NbMF0uaXNJbW0oKQotICAgICAgICAgICAgICAg
ICAgICAmJiBpbnN0LmFyZ3NbMF0udmFsdWUoKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYg
KGluc3QuYXJnc1swXS5pc0ltbSgpICYmIGluc3QuYXJnc1swXS52YWx1ZSgpID49IDApIHsKICAg
ICAgICAgICAgICAgICAgICAgVG1wIHRtcCA9IGluc3QuYXJnc1sxXS50bXAoKTsKLSAgICAgICAg
ICAgICAgICAgICAgV2lkdGhzJiB3aWR0aHMgPSBtX3dpZHRoLmFkZCh0bXAsIFdpZHRocyhHUCkp
Lml0ZXJhdG9yLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgIFdpZHRocyYgdG1wV2lkdGhzID0gd2lkdGhzKHRtcCk7CisgICAgICAgICAgICAgICAgICAg
IFdpZHRoIG1heFdpZHRoID0gV2lkdGg2NDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3Qu
YXJnc1swXS52YWx1ZSgpIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMuZGVmID0gc3RkOjptYXgod2lkdGhzLmRlZiwg
V2lkdGg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gV2lkdGg4OwogICAg
ICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0LmFyZ3NbMF0udmFsdWUoKSA8PSBzdGQ6Om51
bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHdp
ZHRocy5kZWYgPSBzdGQ6Om1heCh3aWR0aHMuZGVmLCBXaWR0aDE2KTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1heFdpZHRoID0gV2lkdGgxNjsKICAgICAgICAgICAgICAgICAgICAgZWxzZSBp
ZiAoaW5zdC5hcmdzWzBdLnZhbHVlKCkgPD0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6
bWF4KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMuZGVmID0gc3RkOjptYXgod2lk
dGhzLmRlZiwgV2lkdGgzMik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHdpZHRocy5kZWYgPSBzdGQ6Om1heCh3aWR0aHMuZGVmLCBXaWR0aDY0KTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gV2lkdGgzMjsKKworICAgICAgICAg
ICAgICAgICAgICB0bXBXaWR0aHMuZGVmID0gc3RkOjptYXgodG1wV2lkdGhzLmRlZiwgbWF4V2lk
dGgpOwogCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcCgKLSAgICAgICAgICAg
ICAgICBbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCB3aWR0
aCkgewotICAgICAgICAgICAgICAgICAgICBXaWR0aHMmIHdpZHRocyA9IG1fd2lkdGguYWRkKHRt
cCwgV2lkdGhzKGJhbmspKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBCYW5rIHRtcEJh
bmssIFdpZHRoIHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBcmcodG1wKS5iYW5r
KCkgIT0gYmFuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAg
ICAgICAgICAgICBXaWR0aHMmIHRtcFdpZHRocyA9IHdpZHRocyh0bXApOwogICAgICAgICAgICAg
ICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IHdpZHRocy51c2UgPSBzdGQ6Om1heCh3aWR0aHMudXNlLCB3aWR0aCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICB0bXBXaWR0aHMudXNlID0gc3RkOjptYXgodG1wV2lkdGhzLnVzZSwgd2lkdGgp
OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzWkRlZihyb2xlKSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHdpZHRocy5kZWYgPSBzdGQ6Om1heCh3aWR0aHMuZGVmLCB3aWR0aCk7
CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBXaWR0aHMuZGVmID0gc3RkOjptYXgodG1wV2lk
dGhzLmRlZiwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmc6OmlzQW55
RGVmKHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLmRlZiA9IGNvbnNlcnZh
dGl2ZVdpZHRoKGJhbmspOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wV2lkdGhzLmRlZiA9
IGNvbnNlcnZhdGl2ZVdpZHRoKHRtcEJhbmspOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAg
ICB9CiAgICAgfQpAQCAtMTM5LDEyICsxNDIsOCBAQCB2b2lkIFRtcFdpZHRoOjpyZWNvbXB1dGUo
Q29kZSYgY29kZSkKICAgICAgICAgICAgIEFTU0VSVChtb3ZlLT5hcmdzWzBdLmlzVG1wKCkpOwog
ICAgICAgICAgICAgQVNTRVJUKG1vdmUtPmFyZ3NbMV0uaXNUbXAoKSk7CiAKLSAgICAgICAgICAg
IC8vIFdlIGFscmVhZHkgZW5zdXJlIHRoYXQgYm90aCB0bXBzIGFyZSBhZGRlZCB0byB0aGUgd2lk
dGggbWFwLiBUaGF0J3MgaW1wb3J0YW50Ci0gICAgICAgICAgICAvLyBiZWNhdXNlIHlvdSBjYW5u
b3QgYWRkIGJvdGggdG1wcyBoZXJlIHdoaWxlIHNpbXVsdGFuZW91c2x5IGdldHRpbmcgYSByZWZl
cmVuY2UgdG8KLSAgICAgICAgICAgIC8vIHRoZWlyIHZhbHVlcywgc2luY2UgdGhlIHNlY29uZCBh
ZGQgd291bGQgaW52YWxpZGF0ZSB0aGUgcmVmZXJlbmNlIHJldHVybmVkIGJ5IHRoZQotICAgICAg
ICAgICAgLy8gZmlyc3Qgb25lLgotICAgICAgICAgICAgV2lkdGhzJiBzcmNXaWR0aHMgPSBtX3dp
ZHRoLmZpbmQobW92ZS0+YXJnc1swXS50bXAoKSktPnZhbHVlOwotICAgICAgICAgICAgV2lkdGhz
JiBkc3RXaWR0aHMgPSBtX3dpZHRoLmZpbmQobW92ZS0+YXJnc1sxXS50bXAoKSktPnZhbHVlOwor
ICAgICAgICAgICAgV2lkdGhzJiBzcmNXaWR0aHMgPSB3aWR0aHMobW92ZS0+YXJnc1swXS50bXAo
KSk7CisgICAgICAgICAgICBXaWR0aHMmIGRzdFdpZHRocyA9IHdpZHRocyhtb3ZlLT5hcmdzWzFd
LnRtcCgpKTsKIAogICAgICAgICAgICAgLy8gTGVnZW5kOgogICAgICAgICAgICAgLy8KQEAgLTE2
OCw4ICsxNjcsMTEgQEAgdm9pZCBUbXBXaWR0aDo6cmVjb21wdXRlKENvZGUmIGNvZGUpCiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgZGF0YUxvZygid2lkdGg6
ICIsIG1hcER1bXAobV93aWR0aCksICJcbiIpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAg
IGRhdGFMb2dMbigiYmFuazogIiwgYmFuaywgIiwgd2lkdGhzVmVjdG9yOiAiKTsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJhbmtXaWR0aHNWZWN0b3Iuc2l6ZSgpOyArK2kpCisg
ICAgICAgICAgICBkYXRhTG9nTG4oIlx0IiwgaSwgIiA6ICIsIGJhbmtXaWR0aHNWZWN0b3JbaV0p
OworICAgIH0KIH0KIAogdm9pZCBUbXBXaWR0aDo6V2lkdGhzOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRt
cFdpZHRoLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFdpZHRoLmgKaW5k
ZXggYjIzYjMyNzJhMDI4Li5hYTljM2M1ZjdjZWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyVG1wV2lkdGguaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpclRtcFdpZHRoLmgKQEAgLTM5LDYgKzM5LDcgQEAgcHVibGljOgogICAgIFRtcFdp
ZHRoKENvZGUmKTsKICAgICB+VG1wV2lkdGgoKTsKIAorICAgIHRlbXBsYXRlIDxCYW5rIGJhbms+
CiAgICAgdm9pZCByZWNvbXB1dGUoQ29kZSYpOwogCiAgICAgLy8gVGhlIHdpZHRoIG9mIGEgVG1w
IGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gdHJhY2sg
d2l0aG91dCBzb21lIHRyaXZpYWwKQEAgLTUyLDE5ICs1MywxNSBAQCBwdWJsaWM6CiAgICAgLy8g
bWV0aG9kcy4KICAgICBXaWR0aCB3aWR0aChUbXAgdG1wKSBjb25zdAogICAgIHsKLSAgICAgICAg
YXV0byBpdGVyID0gbV93aWR0aC5maW5kKHRtcCk7Ci0gICAgICAgIGlmIChpdGVyID09IG1fd2lk
dGguZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4gbWluaW11bVdpZHRoKEFyZyh0bXApLmJhbmso
KSk7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1pbihpdGVyLT52YWx1ZS51c2UsIGl0ZXItPnZhbHVl
LmRlZik7CisgICAgICAgIFdpZHRocyB0bXBXaWR0aHMgPSB3aWR0aHModG1wKTsKKyAgICAgICAg
cmV0dXJuIHN0ZDo6bWluKHRtcFdpZHRocy51c2UsIHRtcFdpZHRocy5kZWYpOwogICAgIH0KIAog
ICAgIC8vIFJldHVybiB0aGUgbWluaW11bSByZXF1aXJlZCB3aWR0aCBmb3IgYWxsIGRlZnMvdXNl
cyBvZiB0aGlzIFRtcC4KICAgICBXaWR0aCByZXF1aXJlZFdpZHRoKFRtcCB0bXApCiAgICAgewot
ICAgICAgICBhdXRvIGl0ZXIgPSBtX3dpZHRoLmZpbmQodG1wKTsKLSAgICAgICAgaWYgKGl0ZXIg
PT0gbV93aWR0aC5lbmQoKSkKLSAgICAgICAgICAgIHJldHVybiBtaW5pbXVtV2lkdGgoQXJnKHRt
cCkuYmFuaygpKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGl0ZXItPnZhbHVlLnVzZSwgaXRl
ci0+dmFsdWUuZGVmKTsKKyAgICAgICAgV2lkdGhzIHRtcFdpZHRocyA9IHdpZHRocyh0bXApOwor
ICAgICAgICByZXR1cm4gc3RkOjptYXgodG1wV2lkdGhzLnVzZSwgdG1wV2lkdGhzLmRlZik7CiAg
ICAgfQogCiAgICAgLy8gVGhpcyBpbmRpcmVjdGx5IHRlbGxzIHlvdSBob3cgbXVjaCBvZiB0aGUg
dG1wJ3MgaGlnaCBiaXRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIHplcm8uIFRoZSBudW1iZXIgb2YK
QEAgLTc1LDE5ICs3MiwxMyBAQCBwdWJsaWM6CiAgICAgLy8gV2hlcmUgVG90YWxCaXRzIGFyZSB0
aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHJlZ2lzdGVyLCBzbyA2NCBvbiBhIDY0LWJp
dCBzeXN0ZW0uCiAgICAgV2lkdGggZGVmV2lkdGgoVG1wIHRtcCkgY29uc3QKICAgICB7Ci0gICAg
ICAgIGF1dG8gaXRlciA9IG1fd2lkdGguZmluZCh0bXApOwotICAgICAgICBpZiAoaXRlciA9PSBt
X3dpZHRoLmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIG1pbmltdW1XaWR0aChBcmcodG1wKS5i
YW5rKCkpOwotICAgICAgICByZXR1cm4gaXRlci0+dmFsdWUuZGVmOworICAgICAgICByZXR1cm4g
d2lkdGhzKHRtcCkuZGVmOwogICAgIH0KIAogICAgIC8vIFRoaXMgdGVsbHMgeW91IGhvdyBtdWNo
IG9mIFRtcCBpcyBnb2luZyB0byBiZSByZWFkLgogICAgIFdpZHRoIHVzZVdpZHRoKFRtcCB0bXAp
IGNvbnN0CiAgICAgewotICAgICAgICBhdXRvIGl0ZXIgPSBtX3dpZHRoLmZpbmQodG1wKTsKLSAg
ICAgICAgaWYgKGl0ZXIgPT0gbV93aWR0aC5lbmQoKSkKLSAgICAgICAgICAgIHJldHVybiBtaW5p
bXVtV2lkdGgoQXJnKHRtcCkuYmFuaygpKTsKLSAgICAgICAgcmV0dXJuIGl0ZXItPnZhbHVlLnVz
ZTsKKyAgICAgICAgcmV0dXJuIHdpZHRocyh0bXApLnVzZTsKICAgICB9CiAgICAgCiBwcml2YXRl
OgpAQCAtOTUsOSArODYsMTUgQEAgcHJpdmF0ZToKICAgICAgICAgV2lkdGhzKCkgeyB9CiAKICAg
ICAgICAgV2lkdGhzKEJhbmsgYmFuaykKKyAgICAgICAgICAgIDogdXNlKG1pbmltdW1XaWR0aChi
YW5rKSkKKyAgICAgICAgICAgICwgZGVmKG1pbmltdW1XaWR0aChiYW5rKSkKKyAgICAgICAgewor
ICAgICAgICB9CisKKyAgICAgICAgV2lkdGhzKFdpZHRoIHVzZUFyZywgV2lkdGggZGVmQXJnKQor
ICAgICAgICAgICAgOiB1c2UodXNlQXJnKQorICAgICAgICAgICAgLCBkZWYoZGVmQXJnKQogICAg
ICAgICB7Ci0gICAgICAgICAgICB1c2UgPSBtaW5pbXVtV2lkdGgoYmFuayk7Ci0gICAgICAgICAg
ICBkZWYgPSBtaW5pbXVtV2lkdGgoYmFuayk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIGR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CkBAIC0xMDUsOCArMTAyLDM2IEBAIHByaXZhdGU6
CiAgICAgICAgIFdpZHRoIHVzZTsKICAgICAgICAgV2lkdGggZGVmOwogICAgIH07Ci0gICAgCi0g
ICAgSGFzaE1hcDxUbXAsIFdpZHRocz4gbV93aWR0aDsKKworICAgIFdpZHRocyYgd2lkdGhzKFRt
cCB0bXApCisgICAgeworICAgICAgICBpZiAodG1wLmlzR1AoKSkgeworICAgICAgICAgICAgdW5z
aWduZWQgaW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjxHUD46OmFic29sdXRlSW5kZXgodG1wKTsK
KyAgICAgICAgICAgIEFTU0VSVChpbmRleCA8IG1fd2lkdGhHUC5zaXplKCkpOworICAgICAgICAg
ICAgcmV0dXJuIG1fd2lkdGhHUFtpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQg
aW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjxGUD46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAg
ICAgQVNTRVJUKGluZGV4IDwgbV93aWR0aEZQLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtX3dp
ZHRoRlBbaW5kZXhdOworICAgIH0KKyAgICBjb25zdCBXaWR0aHMmIHdpZHRocyhUbXAgdG1wKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VG1wV2lkdGgqPih0aGlzKS0+
d2lkdGhzKHRtcCk7CisgICAgfQorCisgICAgdm9pZCBhZGRXaWR0aHMoVG1wIHRtcCwgV2lkdGhz
IHRtcFdpZHRocykKKyAgICB7CisgICAgICAgIHdpZHRocyh0bXApID0gdG1wV2lkdGhzOworICAg
IH0KKworICAgIFZlY3RvcjxXaWR0aHM+JiB3aWR0aHNWZWN0b3IoQmFuayBiYW5rKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGJhbmsgPT0gR1AgPyBtX3dpZHRoR1AgOiBtX3dpZHRoRlA7CisgICAg
fQorCisgICAgLy8gVGhlc2UgYXJlIGluaXRpYWxpemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgcmVj
b21wdXRlPGJhbms+LCB3aGljaCBpcyBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciBib3Ro
IHZhbHVlcyBvZiBiYW5rLgorICAgIFZlY3RvcjxXaWR0aHM+IG1fd2lkdGhHUDsKKyAgICBWZWN0
b3I8V2lkdGhzPiBtX3dpZHRoRlA7CiB9OwogCiB9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>