<?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>142253</bug_id>
          
          <creation_ts>2015-03-03 20:15:41 -0800</creation_ts>
          <short_desc>Implement -apple-trailing-word: -apple-partially-balanced</short_desc>
          <delta_ts>2015-03-04 12:48:30 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>hyatt</cc>
    
    <cc>jonlee</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1073940</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-03 20:15:41 -0800</bug_when>
    <thetext>Implement -apple-trailing-word: -apple-partially-balanced</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073943</commentid>
    <comment_count>1</comment_count>
      <attachid>247829</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-03 20:33:07 -0800</bug_when>
    <thetext>Created attachment 247829
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073950</commentid>
    <comment_count>2</comment_count>
      <attachid>247831</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-03 20:47:50 -0800</bug_when>
    <thetext>Created attachment 247831
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073952</commentid>
    <comment_count>3</comment_count>
      <attachid>247833</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-03 20:50:02 -0800</bug_when>
    <thetext>Created attachment 247833
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074132</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-04 11:16:38 -0800</bug_when>
    <thetext>&lt;rdar://problem/19199732&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074150</commentid>
    <comment_count>5</comment_count>
      <attachid>247833</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-04 11:49:21 -0800</bug_when>
    <thetext>Comment on attachment 247833
Patch

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

Just one change.

&gt; Source/WebCore/rendering/line/BreakingContextInlineHeaders.h:1185
&gt; +#if ENABLE(CSS_TRAILING_WORD)
&gt; +    if (m_blockStyle.trailingWord() == TrailingWord::PartiallyBalanced) {
&gt; +        InlineIterator lineBreak = m_lineBreakHistory.current();
&gt; +        if (lineBreak.renderer() &amp;&amp; m_lineInfo.isFirstLine() &amp;&amp; !bidiNextSkippingEmptyInlines(*lineBreak.root(), lineBreak.renderer()) &amp;&amp; is&lt;RenderText&gt;(lineBreak.renderer())) {
&gt; +            RenderText&amp; renderText = downcast&lt;RenderText&gt;(*lineBreak.renderer());
&gt; +            // Don&apos;t even bother measuring if our remaining line has many characters
&gt; +            if (renderText.textLength() == lineBreak.offset() || renderText.textLength() - lineBreak.offset() &gt; 20)
&gt; +                return lineBreak;
&gt; +            bool isLooseCJKMode = m_renderTextInfo.m_text != &amp;renderText &amp;&amp; m_renderTextInfo.m_lineBreakIterator.isLooseCJKMode();
&gt; +            bool breakNBSP = m_autoWrap &amp;&amp; m_currentStyle-&gt;nbspMode() == SPACE;
&gt; +            int nextBreakablePosition = lineBreak.nextBreakablePosition();
&gt; +            isBreakable(m_renderTextInfo.m_lineBreakIterator, lineBreak.offset() + 1, nextBreakablePosition, breakNBSP, isLooseCJKMode);
&gt; +            if (nextBreakablePosition &lt; 0 || static_cast&lt;unsigned&gt;(nextBreakablePosition) != renderText.textLength())
&gt; +                return lineBreak;
&gt; +            const RenderStyle&amp; style = lineStyle(renderText, m_lineInfo);
&gt; +            const FontCascade&amp; font = style.fontCascade();
&gt; +            HashSet&lt;const Font*&gt; dummyFonts;
&gt; +            InlineIterator best = lineBreak;
&gt; +            for (size_t i = 1; i &lt; m_lineBreakHistory.historyLength(); ++i) {
&gt; +                const InlineIterator&amp; candidate = m_lineBreakHistory.get(i);
&gt; +                if (candidate.renderer() != lineBreak.renderer())
&gt; +                    return best;
&gt; +                float width = textWidth(renderText, candidate.offset(), renderText.textLength() - candidate.offset(), font, 0, font.isFixedPitch(), m_collapseWhiteSpace, dummyFonts);
&gt; +                if (width &gt; m_width.availableWidth())
&gt; +                    return best;
&gt; +                if (width / m_width.availableWidth() &gt; 0.1) // Subsequent line is long enough
&gt; +                    return candidate;
&gt; +                best = candidate;
&gt; +            }
&gt; +            return best;
&gt; +        }
&gt; +    }
&gt; +#endif

This is long enough that it should just be put in its own helper function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074181</commentid>
    <comment_count>6</comment_count>
      <attachid>247882</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-04 12:41:09 -0800</bug_when>
    <thetext>Created attachment 247882
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074183</commentid>
    <comment_count>7</comment_count>
      <attachid>247882</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-04 12:43:21 -0800</bug_when>
    <thetext>Comment on attachment 247882
Patch

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

r=me

&gt; Source/WebCore/rendering/line/BreakingContextInlineHeaders.h:1172
&gt; +    if (renderText.textLength() == lineBreak.offset() || renderText.textLength() - lineBreak.offset() &gt; 20)
&gt; +        return lineBreak;

You should use a defined constant for the value 20 rather than just putting the raw number in this function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074184</commentid>
    <comment_count>8</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-04 12:48:30 -0800</bug_when>
    <thetext>Committed r181013: &lt;http://trac.webkit.org/changeset/181013&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247829</attachid>
            <date>2015-03-03 20:33:07 -0800</date>
            <delta_ts>2015-03-03 20:47:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142253-20150303203248.patch</filename>
            <type>text/plain</type>
            <size>133290</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgwOTQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMWE2NGNiOGE5NzFjZjA4
MTFlOGI5NzI2NmZkNmNhOTIxODg4ZWQ0Mi4uZDQ4NjVkMTNlZjRjODU2Y2JmY2ZmNTFlZDRkZGQz
MWY4MGIxODU4NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDU5IEBACiAyMDE1LTAzLTAzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKKyAgICAgICAgSW1wbGVtZW50
IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDIyNTMKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGltcGxl
bWVudHMgYSBoaXN0b3J5IG1lY2hhbmlzbSBmb3IgbGluZSBicmVha2luZy4gSW4gcGFydGljdWxh
ciwgdGhpcyBwYXRjaCBwYXJ0aXRpb25zCisgICAgICAgIHRoZSB1cGRhdGVzIHRvIHRoZSBjdXJy
ZW50IGxpbmUgYnJlYWtpbmcgbG9jYXRpb24gaW50byB0d28ga2luZHM6IGNvbmNlcHR1YWxseSBu
ZXcgYnJlYWtpbmcgbG9jYXRpb25zLAorICAgICAgICBhbmQgZml4dXBzIHRvIGV4aXN0aW5nIGxv
Y2F0aW9ucy4gVGhlbiwgdGhpcyBwYXRjaCByZW1lbWJlcnMgYWxsIHRoZSBmaXhlZCB1cCBicmVh
a2luZyBsb2NhdGlvbnMsIHVwCisgICAgICAgIHRvIGEgbWF4aW11bSBudW1iZXIgb2YgcmVtZW1i
ZXJlZCBsb2NhdGlvbnMuCisKKyAgICAgICAgVGhlIHBhdGNoIHRoZW4gdXNlcyB0aGlzIG1lbW9y
eSB0byBjaGFuZ2UgdGhlIGxpbmUtYnJlYWtpbmcgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBydWxl
cyBvZgorICAgICAgICAtYXBwbGUtdHJhaWxpbmctd29yZC4KKworICAgICAgICBUaGlzIHBhdGNo
IGFsc28gcGVyZm9ybXMgc29tZSBjbGVhbnVwIG9mIEJyZWFraW5nQ29udGV4dCwgYnkgcmVuYW1p
bmcgQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCisgICAgICAgIHRvIHNpbXBseSBCcmVh
a2luZ0NvbnRleHQuaCBhbmQgbWlncmF0aW5nIG5vbi1udWxsIHBvaW50ZXJzIHRvIHJlZmVyZW5j
ZXMuCisKKyAgICAgICAgVGVzdDogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbAorCisgICAg
ICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvajogUmVuYW1lIEJyZWFraW5nQ29u
dGV4dElubGluZUhlYWRlcnMuaCB0byBCcmVha2luZ0NvbnRleHQuaAorICAgICAgICAqIFdlYkNv
cmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ouZmlsdGVyczogRGl0dG8uCisgICAgICAgICogV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOiBEaXR0by4KKyAgICAgICAgKiByZW5kZXJp
bmcvSW5saW5lSXRlcmF0b3IuaDogVXNlIG51bGxwdHIgaW5zdGVhZCBvZiAwCisgICAgICAgIChX
ZWJDb3JlOjpJbmxpbmVJdGVyYXRvcjo6SW5saW5lSXRlcmF0b3IpOgorICAgICAgICAoV2ViQ29y
ZTo6SW5saW5lSXRlcmF0b3I6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OmJpZGlOZXh0U2hh
cmVkKToKKyAgICAgICAgKFdlYkNvcmU6OmJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6YmlkaU5leHRJbmNsdWRpbmdFbXB0eUlubGluZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6SW5saW5lV2Fsa2VyOjpJbmxpbmVXYWxrZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6SW5saW5lSXRlcmF0b3I6OmluY3JlbWVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHA6IFVzZSByZWZlcmVuY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMK
KyAgICAgICAgKFdlYkNvcmU6OnNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25z
Rm9yU2VnbWVudCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0Lmg6
IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRl
eHRJbmxpbmVIZWFkZXJzLmguCisgICAgICAgIFVzZSBJbmxpbmVJdGVyYXRvckhpc3RvcnkgYXMg
YSBwcm94eSBmb3IgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9jYXRpb24uCisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6SW5saW5lSXRlcmF0
b3JIaXN0b3J5KTogS2VlcHMgdHJhY2sgb2YgaGlzdG9yaWNhbAorICAgICAgICBicmVha2luZyBs
b2NhdGlvbnMKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0
b3JIaXN0b3J5OjpwdXNoKTogUmVtZW1iZXIgYSBuZXcgYnJlYWtpbmcgbG9jYXRpb24KKyAgICAg
ICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5Ojp1cGRh
dGUpOiBVcGRhdGUgYW4gZXhpc3RpbmcgYnJlYWtpbmcgbG9jYXRpb24KKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpyZW5kZXJlcik6IEZv
cndhcmRlZCB0byB0aGUgY3VycmVudCBicmVha2luZyBsb2NhdGlvbgorICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Om9mZnNldCk6IERpdHRv
CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9y
eTo6YXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKTogIERpdHRvCisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6cHJldmlvdXNJblNhbWVOb2Rl
KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0
b3JIaXN0b3J5OjpnZXQpOiBHZXQgb25lIG9mIHRoZSByZW1lbWJlcmVkIGJyZWFraW5nIGxvY2F0
aW9ucworICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhp
c3Rvcnk6OmN1cnJlbnQpOiBHZXQgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9jYXRpb24KKyAgICAg
ICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpoaXN0
b3J5TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRl
cmF0b3JIaXN0b3J5Ojptb3ZlVG8pOiBGb3J3YXJkZWQgdG8gdGhlIGN1cnJlbnQgYnJlYWtpZ24g
bG9jYXRpb24uCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJh
dG9ySGlzdG9yeTo6aW5jcmVtZW50KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5n
Q29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpjbGVhcik6IERpdHRvCisgICAgICAgIChX
ZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSk6IElmIC1hcHBsZS10cmFp
bGluZy13b3JkIGlzIGluIGVmZmVjdCwgbG9vayBiYWNrIHRocm91Z2gKKyAgICAgICAgdGhlIHJl
bWVtYmVyZWQgYnJlYWtpbmcgbG9jYXRpb25zIGFuZCBjaG9vc2UgdGhlIG9wdGltYWwgb25lLgor
ICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcDogVXBkYXRlICNpbmNsdWRl
LgorCisyMDE1LTAzLTAzICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+
CisKICAgICAgICAgQnJlYWtpbmdDb250ZXh0IGNsZWFudXAKICAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MjE0NgogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagppbmRleCAwNDQyYmYzMWE1MGYyZjQ4NmM0
MTk2NDIyODc0YTIyNjg3NjkyOWM5Li40YzMzOTRiNzU3NjU0NzllY2JjNDQ5ODUyN2NhNjQxNGUz
Y2YxNTFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29y
ZS52Y3hwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZj
eHByb2oKQEAgLTIwMzQ0LDcgKzIwMzQ0LDcgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xSZW5kZXJTZWxlY3Rpb25JbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVyU2xpZGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4uaCIgLz4KLSAgICA8Q2xJ
bmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dElubGluZUhl
YWRlcnMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXEJy
ZWFraW5nQ29udGV4dC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5n
XGxpbmVcTGluZUJyZWFrZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRl
cmluZ1xsaW5lXExpbmVJbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5k
ZXJpbmdcbGluZVxMaW5lSW5saW5lSGVhZGVycy5oIiAvPgpAQCAtMjE0MjUsNCArMjE0MjUsNCBA
QAogICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICAgIDxJbXBvcnQg
UHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxCdWlsZEN1c3RvbWl6YXRpb25zXG1hc20udGFyZ2V0
cyIgLz4KICAgPC9JbXBvcnRHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBv
ZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZj
eHByb2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnMgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZj
eHByb2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnMKaW5kZXggODM0ZWYxNjdmY2Y0YjYyNjQzYWEx
MGNmNjQ3NWM0MGQwZmYzZTdlMC4uMjNhMGE2MzgxNjMwYzJhNDUyZTc4NzZjZmYyMmY3ZTNjNTBi
MGQ2ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUu
dmN4cHJvai5maWx0ZXJzCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJD
b3JlLnZjeHByb2ouZmlsdGVycwpAQCAtMTQ0MDIsNyArMTQ0MDIsNyBAQAogICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXEJvcmRlckVkZ2UuaCI+CiAgICAgICA8RmlsdGVyPnJl
bmRlcmluZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVk
ZT0iLi5ccmVuZGVyaW5nXGxpbmVcQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIj4KKyAg
ICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dC5o
Ij4KICAgICAgIDxGaWx0ZXI+cmVuZGVyaW5nXGxpbmU8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVk
ZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHBhZ2VcQ29udGV4dE1lbnVDb250ZXh0Lmgi
PgpAQCAtMTUzOTUsNCArMTUzOTUsNCBAQAogICAgICAgPEZpbHRlcj5wbGF0Zm9ybVx3aW48L0Zp
bHRlcj4KICAgICA8L01BU00+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xp
bmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCBjMGVkMTZiYTFmNzM1MDJlMGUyNDkz
YWJhNDE3YTgxMWUxOWQ3YjNmLi44YjdlNTkxYTliZjc1MTg1ODc4ZDBlMTFmYzNiYWUwMjdlYTc0
ZDMxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCkBAIC0xNDMzNiw3ICsxNDMzNiw3IEBACiAJCUZGOTQ1RUNBMTYxRjdGMzYwMDk3MUJD
OCAvKiBQc2V1ZG9FbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBz
ZXVkb0VsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkZBQzMwRkMxODRG
QjE0NTAwOEM0RjFFIC8qIFRyYWlsaW5nT2JqZWN0cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBUcmFpbGluZ09iamVjdHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJRkZBQzMwRkQxODRGQjE0NTAwOEM0RjFFIC8qIFRyYWlsaW5nT2JqZWN0cy5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBUcmFpbGluZ09iamVjdHMuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlGRkI2OThDOTE4MzJGMTBCMDAxNThBMzEgLyogQnJl
YWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUZGQjY5OEM5MTgzMkYxMEIwMDE1OEEzMSAvKiBCcmVha2luZ0NvbnRleHQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQnJlYWtpbmdDb250ZXh0Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5l
QnJlYWtlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMaW5lQnJl
YWtlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGQjY5OENCMTgzM0VDMzgw
MDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBMaW5lQnJlYWtlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRkI2OThDRDE4
MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gTGluZUluZm8uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAt
MjM0MTMsNyArMjM0MTMsNyBAQAogCQlGRkI2OThDODE4MzJGMTBCMDAxNThBMzEgLyogbGluZSAq
LyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCi0JCQkJRkZCNjk4Qzkx
ODMyRjEwQjAwMTU4QTMxIC8qIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCAqLywKKwkJ
CQlGRkI2OThDOTE4MzJGMTBCMDAxNThBMzEgLyogQnJlYWtpbmdDb250ZXh0LmggKi8sCiAJCQkJ
RkZCNjk4Q0ExODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCAqLywKIAkJCQlGRkI2
OThDQjE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIuaCAqLywKIAkJCQlGRkI2OThDRDE4
MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvSW5saW5lSXRlcmF0b3IuaAppbmRleCA3YTc2YWI5ODcwNWY4ZmI3ZGEyZDBhMmM5NjI4NDQ4
ZDU5YzRhNTI2Li5hOWVmZTBkMDZkYTI0Y2I3MzAwMGM1ODQ3ZTg5ZmNmZmY4OGZlM2MxIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaApAQCAtMzcsOCArMzcsOCBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBJbmxpbmVJdGVyYXRvciB7CiBwdWJsaWM6CiAg
ICAgSW5saW5lSXRlcmF0b3IoKQotICAgICAgICA6IG1fcm9vdCgwKQotICAgICAgICAsIG1fcmVu
ZGVyZXIoMCkKKyAgICAgICAgOiBtX3Jvb3QobnVsbHB0cikKKyAgICAgICAgLCBtX3JlbmRlcmVy
KG51bGxwdHIpCiAgICAgICAgICwgbV9uZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCiAgICAgICAg
ICwgbV9wb3MoMCkKICAgICAgICAgLCBtX3JlZmVyc1RvRW5kT2ZQcmV2aW91c05vZGUoZmFsc2Up
CkBAIC01NCw3ICs1NCw3IEBAIHB1YmxpYzoKICAgICB7CiAgICAgfQogCi0gICAgdm9pZCBjbGVh
cigpIHsgbW92ZVRvKDAsIDApOyB9CisgICAgdm9pZCBjbGVhcigpIHsgbW92ZVRvKG51bGxwdHIs
IDApOyB9CiAKICAgICB2b2lkIG1vdmVUb1N0YXJ0T2YoUmVuZGVyT2JqZWN0KiBvYmplY3QpCiAg
ICAgewpAQCAtNzksNyArNzksNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRSZWZlcnNUb0VuZE9m
UHJldmlvdXNOb2RlKCk7CiAKICAgICB2b2lkIGZhc3RJbmNyZW1lbnRJblRleHROb2RlKCk7Ci0g
ICAgdm9pZCBpbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiA9IDApOworICAgIHZvaWQgaW5j
cmVtZW50KElubGluZUJpZGlSZXNvbHZlciogPSBudWxscHRyKTsKICAgICB2b2lkIGZhc3REZWNy
ZW1lbnQoKTsKICAgICBib29sIGF0RW5kKCkgY29uc3Q7CiAKQEAgLTIxMiw3ICsyMTIsNyBAQCBz
dGF0aWMgYm9vbCBpc0VtcHR5SW5saW5lKGNvbnN0IFJlbmRlcklubGluZSYgcmVuZGVyZXIpCiAv
LyBUaGlzIGZ1bmN0aW9uIHdpbGwgaXRlcmF0ZSBvdmVyIGlubGluZXMgd2l0aGluIGEgYmxvY2ss
IG9wdGlvbmFsbHkgbm90aWZ5aW5nCiAvLyBhIGJpZGkgcmVzb2x2ZXIgYXMgaXQgZW50ZXJzL2V4
aXRzIGlubGluZXMgKHNvIGl0IGNhbiBwdXNoL3BvcCBlbWJlZGRpbmcgbGV2ZWxzKS4KIHRlbXBs
YXRlIDxjbGFzcyBPYnNlcnZlcj4KLXN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4
dFNoYXJlZChSZW5kZXJFbGVtZW50JiByb290LCBSZW5kZXJPYmplY3QqIGN1cnJlbnQsIE9ic2Vy
dmVyKiBvYnNlcnZlciA9IDAsIEVtcHR5SW5saW5lQmVoYXZpb3IgZW1wdHlJbmxpbmVCZWhhdmlv
ciA9IFNraXBFbXB0eUlubGluZXMsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKK3N0YXRpYyBp
bmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4dFNoYXJlZChSZW5kZXJFbGVtZW50JiByb290LCBS
ZW5kZXJPYmplY3QqIGN1cnJlbnQsIE9ic2VydmVyKiBvYnNlcnZlciA9IG51bGxwdHIsIEVtcHR5
SW5saW5lQmVoYXZpb3IgZW1wdHlJbmxpbmVCZWhhdmlvciA9IFNraXBFbXB0eUlubGluZXMsIGJv
b2wqIGVuZE9mSW5saW5lUHRyID0gbnVsbHB0cikKIHsKICAgICBSZW5kZXJPYmplY3QqIG5leHQg
PSBudWxscHRyOwogICAgIC8vIG9sZEVuZE9mSW5saW5lIGRlbm90ZXMgaWYgd2hlbiB3ZSBsYXN0
IHN0b3BwZWQgaXRlcmF0aW5nIGlmIHdlIHdlcmUgYXQgdGhlIGVuZCBvZiBhbiBpbmxpbmUuCkBA
IC0yNzgsMTMgKzI3OCwxMyBAQCBzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogYmlkaU5leHRT
a2lwcGluZ0VtcHR5SW5saW5lcyhSZW5kZXJFbGVtZW50JiByb290LCBSZQogLy8gVGhpcyBtYWtl
cyBjYWxsZXJzIGNsZWFuZXIgYXMgdGhleSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgYSB0eXBlIGZv
ciB0aGUgb2JzZXJ2ZXIgd2hlbiBub3QgcHJvdmlkaW5nIG9uZS4KIHN0YXRpYyBpbmxpbmUgUmVu
ZGVyT2JqZWN0KiBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJv
b3QsIFJlbmRlck9iamVjdCogY3VycmVudCkKIHsKLSAgICBJbmxpbmVCaWRpUmVzb2x2ZXIqIG9i
c2VydmVyID0gMDsKKyAgICBJbmxpbmVCaWRpUmVzb2x2ZXIqIG9ic2VydmVyID0gbnVsbHB0cjsK
ICAgICByZXR1cm4gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhyb290LCBjdXJyZW50LCBv
YnNlcnZlcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4dEluY2x1
ZGluZ0VtcHR5SW5saW5lcyhSZW5kZXJFbGVtZW50JiByb290LCBSZW5kZXJPYmplY3QqIGN1cnJl
bnQsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKK3N0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0
KiBiaWRpTmV4dEluY2x1ZGluZ0VtcHR5SW5saW5lcyhSZW5kZXJFbGVtZW50JiByb290LCBSZW5k
ZXJPYmplY3QqIGN1cnJlbnQsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gbnVsbHB0cikKIHsKLSAg
ICBJbmxpbmVCaWRpUmVzb2x2ZXIqIG9ic2VydmVyID0gMDsgLy8gQ2FsbGVycyB3aG8gaW5jbHVk
ZSBlbXB0eSBpbmxpbmVzLCBuZXZlciB1c2UgYW4gb2JzZXJ2ZXIuCisgICAgSW5saW5lQmlkaVJl
c29sdmVyKiBvYnNlcnZlciA9IG51bGxwdHI7IC8vIENhbGxlcnMgd2hvIGluY2x1ZGUgZW1wdHkg
aW5saW5lcywgbmV2ZXIgdXNlIGFuIG9ic2VydmVyLgogICAgIHJldHVybiBiaWRpTmV4dFNoYXJl
ZChyb290LCBjdXJyZW50LCBvYnNlcnZlciwgSW5jbHVkZUVtcHR5SW5saW5lcywgZW5kT2ZJbmxp
bmVQdHIpOwogfQogCkBAIC0zNTMsNyArMzUzLDcgQEAgY2xhc3MgSW5saW5lV2Fsa2VyIHsKIHB1
YmxpYzoKICAgICBJbmxpbmVXYWxrZXIoUmVuZGVyRWxlbWVudCYgcm9vdCkKICAgICAgICAgOiBt
X3Jvb3Qocm9vdCkKLSAgICAgICAgLCBtX2N1cnJlbnQoMCkKKyAgICAgICAgLCBtX2N1cnJlbnQo
bnVsbHB0cikKICAgICAgICAgLCBtX2F0RW5kT2ZJbmxpbmUoZmFsc2UpCiAgICAgewogICAgICAg
ICAvLyBGSVhNRTogVGhpcyBjbGFzcyBzaG91bGQgYmUgdGF1Z2h0IGhvdyB0byBkbyB0aGUgU2tp
cEVtcHR5SW5saW5lcyBjb2RlcGF0aCBhcyB3ZWxsLgpAQCAtMzg3LDcgKzM4Nyw3IEBAIGlubGlu
ZSB2b2lkIElubGluZUl0ZXJhdG9yOjppbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiByZXNv
bHZlcikKICAgICAgICAgaWYgKG1fcG9zIDwgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fcmVuZGVy
ZXIpLnRleHRMZW5ndGgoKSkKICAgICAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgLy8gYmlk
aU5leHQgY2FuIHJldHVybiAwLCBzbyB1c2UgbW92ZVRvIGluc3RlYWQgb2YgbW92ZVRvU3RhcnRP
ZgorICAgIC8vIGJpZGlOZXh0IGNhbiByZXR1cm4gbnVsbHB0ciwgc28gdXNlIG1vdmVUbyBpbnN0
ZWFkIG9mIG1vdmVUb1N0YXJ0T2YKICAgICBtb3ZlVG8oYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5s
aW5lcygqbV9yb290LCBtX3JlbmRlcmVyLCByZXNvbHZlciksIDApOwogfQogCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IDk5
ZDlmYTNhZmMxZDM3NGI4NzFkMDgyMzIwZjZlYTcyMDU1YmY2NGQuLmU4ZWU2YjBkNjg2ZjAxMTcz
MGFlZTIxYzQ3ZTc1ZTc4OGY2Yzc2NWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNs
dWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCi0jaW5jbHVk
ZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgorI2luY2x1ZGUgIkJyZWFraW5nQ29u
dGV4dC5oIgogI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgogI2luY2x1ZGUgIklubGluZUVs
ZW1lbnRCb3guaCIKICNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgpAQCAtNDU1LDEzICs0NTUs
MTMgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4q
IHJ1biwgUmVuZGVyUnVieVJ1biYgcmVuZGVyZXIKICAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChy
ZW5kZXJlciwgLWVuZE92ZXJoYW5nKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2lj
YWxXaWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnVuLCBS
ZW5kZXJUZXh0KiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZv
LAorc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4oUm9vdElubGlu
ZUJveCogbGluZUJveCwgQmlkaVJ1biogcnVuLCBSZW5kZXJUZXh0JiByZW5kZXJlciwgZmxvYXQg
eFBvcywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLAogICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCiB7
CiAgICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250czsKICAgICBHbHlwaE92ZXJm
bG93IGdseXBoT3ZlcmZsb3c7CiAKLSAgICBjb25zdCBGb250Q2FzY2FkZSYgZm9udCA9IGxpbmVT
dHlsZSgqcmVuZGVyZXItPnBhcmVudCgpLCBsaW5lSW5mbykuZm9udENhc2NhZGUoKTsKKyAgICBj
b25zdCBGb250Q2FzY2FkZSYgZm9udCA9IGxpbmVTdHlsZSgqcmVuZGVyZXIucGFyZW50KCksIGxp
bmVJbmZvKS5mb250Q2FzY2FkZSgpOwogICAgIC8vIEFsd2F5cyBjb21wdXRlIGdseXBoIG92ZXJm
bG93IGlmIHRoZSBibG9jaydzIGxpbmUtYm94LWNvbnRhaW4gdmFsdWUgaXMgImdseXBocyIuCiAg
ICAgaWYgKGxpbmVCb3gtPmZpdHNUb0dseXBocygpKSB7CiAgICAgICAgIC8vIElmIHdlIGRvbid0
IHN0aWNrIG91dCBvZiB0aGUgcm9vdCBsaW5lJ3MgZm9udCBib3gsIHRoZW4gZG9uJ3QgYm90aGVy
IGNvbXB1dGluZyBvdXIgZ2x5cGggb3ZlcmZsb3cuIFRoaXMgb3B0aW1pemF0aW9uCkBAIC00ODMs
NyArNDgzLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4o
Um9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnUKICAgICBmbG9hdCBtZWFzdXJlZFdp
ZHRoID0gMDsKIAogICAgIGJvb2wga2VybmluZ0lzRW5hYmxlZCA9IGZvbnQudHlwZXNldHRpbmdG
ZWF0dXJlcygpICYgS2VybmluZzsKLSAgICBib29sIGNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCA9
IHJlbmRlcmVyLT5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKKyAgICBib29sIGNhblVzZVNp
bXBsZUZvbnRDb2RlUGF0aCA9IHJlbmRlcmVyLmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpOwog
ICAgIAogICAgIC8vIFNpbmNlIHdlIGRvbid0IGNhY2hlIGdseXBoIG92ZXJmbG93cywgd2UgbmVl
ZCB0byByZS1tZWFzdXJlIHRoZSBydW4gaWYKICAgICAvLyB0aGUgc3R5bGUgaXMgbGluZWJveC1j
b250YWluOiBnbHlwaC4KQEAgLTQ5NCwxOCArNDk0LDE4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBz
ZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4q
IHJ1CiAgICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRN
ZWFzdXJlbWVudHNbaV07CiAgICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LndpZHRoIDw9
IDAgfHwgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID09IHdvcmRNZWFzdXJlbWVudC5lbmRP
ZmZzZXQpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAod29yZE1l
YXN1cmVtZW50LnJlbmRlcmVyICE9IHJlbmRlcmVyIHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9m
ZnNldCAhPSBsYXN0RW5kT2Zmc2V0IHx8IHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPiBydW4t
Pm1fc3RvcCkKKyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgIT0gJnJl
bmRlcmVyIHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCAhPSBsYXN0RW5kT2Zmc2V0IHx8
IHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPiBydW4tPm1fc3RvcCkKICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKIAogICAgICAgICAgICAgbGFzdEVuZE9mZnNldCA9IHdvcmRNZWFzdXJlbWVu
dC5lbmRPZmZzZXQ7CiAgICAgICAgICAgICBpZiAoa2VybmluZ0lzRW5hYmxlZCAmJiBsYXN0RW5k
T2Zmc2V0ID09IHJ1bi0+bV9zdG9wKSB7CiAgICAgICAgICAgICAgICAgaW50IHdvcmRMZW5ndGgg
PSBsYXN0RW5kT2Zmc2V0IC0gd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0OwogICAgICAgICAg
ICAgICAgIEdseXBoT3ZlcmZsb3cgb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRX
aWR0aCArPSByZW5kZXJlci0+d2lkdGgod29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0LCB3b3Jk
TGVuZ3RoLCB4UG9zICsgbWVhc3VyZWRXaWR0aCwgbGluZUluZm8uaXNGaXJzdExpbmUoKSwKKyAg
ICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLndpZHRoKHdvcmRNZWFzdXJl
bWVudC5zdGFydE9mZnNldCwgd29yZExlbmd0aCwgeFBvcyArIG1lYXN1cmVkV2lkdGgsIGxpbmVJ
bmZvLmlzRmlyc3RMaW5lKCksCiAgICAgICAgICAgICAgICAgICAgICZ3b3JkTWVhc3VyZW1lbnQu
ZmFsbGJhY2tGb250cywgJm92ZXJmbG93KTsKLSAgICAgICAgICAgICAgICBVQ2hhciBjID0gcmVu
ZGVyZXItPmNoYXJhY3RlckF0KHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCk7CisgICAgICAg
ICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVyLmNoYXJhY3RlckF0KHdvcmRNZWFzdXJlbWVudC5z
dGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIHdvcmRMZW5ndGggPT0g
MSAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSkKLSAgICAgICAgICAgICAgICAgICAgbWVhc3Vy
ZWRXaWR0aCArPSByZW5kZXJlci0+c3R5bGUoKS5mb250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCk7
CisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0gcmVuZGVyZXIuc3R5bGUoKS5m
b250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCk7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAg
ICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHdvcmRNZWFzdXJlbWVudC53aWR0aDsKICAgICAgICAg
ICAgIGlmICghd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7CkBAIC01
MjIsNyArNTIyLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRS
dW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnUKICAgICB9CiAKICAgICBpZiAo
IW1lYXN1cmVkV2lkdGgpCi0gICAgICAgIG1lYXN1cmVkV2lkdGggPSByZW5kZXJlci0+d2lkdGgo
cnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCAtIHJ1bi0+bV9zdGFydCwgeFBvcywgbGluZUluZm8u
aXNGaXJzdExpbmUoKSwgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKKyAgICAgICAg
bWVhc3VyZWRXaWR0aCA9IHJlbmRlcmVyLndpZHRoKHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3Ag
LSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksICZmYWxsYmFja0Zv
bnRzLCAmZ2x5cGhPdmVyZmxvdyk7CiAKICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgo
bWVhc3VyZWRXaWR0aCArIGh5cGhlbldpZHRoKTsKICAgICBpZiAoIWZhbGxiYWNrRm9udHMuaXNF
bXB0eSgpKSB7CkBAIC01MzQsNyArNTM0LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2lj
YWxXaWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnUKICAg
ICB9CiAKICAgICAvLyBJbmNsdWRlIHRleHQgZGVjb3JhdGlvbiB2aXN1YWwgb3ZlcmZsb3cgYXMg
cGFydCBvZiB0aGUgZ2x5cGggb3ZlcmZsb3cuCi0gICAgaWYgKHJlbmRlcmVyLT5zdHlsZSgpLnRl
eHREZWNvcmF0aW9uc0luRWZmZWN0KCkgIT0gVGV4dERlY29yYXRpb25Ob25lKQorICAgIGlmIChy
ZW5kZXJlci5zdHlsZSgpLnRleHREZWNvcmF0aW9uc0luRWZmZWN0KCkgIT0gVGV4dERlY29yYXRp
b25Ob25lKQogICAgICAgICBnbHlwaE92ZXJmbG93LmV4dGVuZFRvKHZpc3VhbE92ZXJmbG93Rm9y
RGVjb3JhdGlvbnMocnVuLT5ib3goKS0+bGluZVN0eWxlKCksIGRvd25jYXN0PElubGluZVRleHRC
b3g+KHJ1bi0+Ym94KCkpKSk7CiAKICAgICBpZiAoIWdseXBoT3ZlcmZsb3cuaXNFbXB0eSgpKSB7
CkBAIC03NDcsNyArNzQ3LDcgQEAgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5s
aW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm8KICAgICAgICAgICAg
ICAgICBuZWVkc1dvcmRTcGFjaW5nID0gIWlzU3BhY2VPck5ld2xpbmUocmVuZGVyVGV4dC5jaGFy
YWN0ZXJBdChydW4tPm1fc3RvcCAtIDEpKSAmJiBydW4tPm1fc3RvcCA9PSBsZW5ndGg7CiAgICAg
ICAgICAgICB9CiAKLSAgICAgICAgICAgIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4obGluZUJv
eCwgcnVuLCAmcmVuZGVyVGV4dCwgdG90YWxMb2dpY2FsV2lkdGgsIGxpbmVJbmZvLCB0ZXh0Qm94
RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKKyAgICAg
ICAgICAgIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4obGluZUJveCwgcnVuLCByZW5kZXJUZXh0
LCB0b3RhbExvZ2ljYWxXaWR0aCwgbGluZUluZm8sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUsIHdvcmRNZWFzdXJlbWVudHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgYm9vbCBlbmNvdW50ZXJlZEp1c3RpZmllZFJ1YnkgPSBmYWxzZTsKICAgICAgICAgICAg
IGlmIChpczxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkpICYmIHRleHRBbGlnbiA9PSBK
VVNUSUZZICYmIHJ1biAhPSB0cmFpbGluZ1NwYWNlUnVuICYmIGRvd25jYXN0PFJlbmRlclJ1YnlS
dW4+KHJ1bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKSkgewpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MTgxYWY2YTQ3MDFh
NmI1OTM0YzAxZDYzNDA0YmQ1M2U5NzBlZTNlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwxMTg3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAs
IDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
MyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAy
MDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJy
ZWFraW5nQ29udGV4dF9oCisjZGVmaW5lIEJyZWFraW5nQ29udGV4dF9oCisKKyNpbmNsdWRlICJI
eXBoZW5hdGlvbi5oIgorI2luY2x1ZGUgIkxpbmVCcmVha2VyLmgiCisjaW5jbHVkZSAiTGluZUlu
Zm8uaCIKKyNpbmNsdWRlICJMaW5lV2lkdGguaCIKKyNpbmNsdWRlICJSZW5kZXJDb21iaW5lVGV4
dC5oIgorI2luY2x1ZGUgIlJlbmRlckNvdW50ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJJbmxpbmUu
aCIKKyNpbmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKKyNpbmNsdWRlICJSZW5kZXJMaXN0TWFy
a2VyLmgiCisjaW5jbHVkZSAiUmVuZGVyUnVieVJ1bi5oIgorI2luY2x1ZGUgIlJlbmRlclNWR0lu
bGluZVRleHQuaCIKKyNpbmNsdWRlICJUcmFpbGluZ09iamVjdHMuaCIKKyNpbmNsdWRlICJicmVh
a19saW5lcy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ1ZpZXcuaD4KKyNpbmNsdWRlIDx3
dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8v
IFdlIGRvbid0IGxldCBvdXIgbGluZSBib3ggdHJlZSBmb3IgYSBzaW5nbGUgbGluZSBnZXQgYW55
IGRlZXBlciB0aGFuIHRoaXMuCitjb25zdCB1bnNpZ25lZCBjTWF4TGluZURlcHRoID0gMjAwOwor
CitzdHJ1Y3QgV29yZE1lYXN1cmVtZW50IHsKKyAgICBXb3JkTWVhc3VyZW1lbnQoKQorICAgICAg
ICA6IHJlbmRlcmVyKDApCisgICAgICAgICwgd2lkdGgoMCkKKyAgICAgICAgLCBzdGFydE9mZnNl
dCgwKQorICAgICAgICAsIGVuZE9mZnNldCgwKQorICAgIHsKKyAgICB9CisKKyAgICBSZW5kZXJU
ZXh0KiByZW5kZXJlcjsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpbnQgc3RhcnRPZmZzZXQ7Cisg
ICAgaW50IGVuZE9mZnNldDsKKyAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBmYWxsYmFja0ZvbnRz
OworfTsKKworY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKK3B1YmxpYzoKKyAgICBCcmVha2luZ0Nv
bnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29s
dmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRoJiBsaW5lV2lkdGgsIFJlbmRlclRl
eHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogaW5MYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRoLCBSZW5kZXJCbG9ja0Zsb3cmIGJs
b2NrKQorICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJyZWFrZXIpCisgICAgICAgICwgbV9y
ZXNvbHZlcihyZXNvbHZlcikKKyAgICAgICAgLCBtX2N1cnJlbnQocmVzb2x2ZXIucG9zaXRpb24o
KSkKKyAgICAgICAgLCBtX2xpbmVCcmVha0hpc3RvcnkoSW5saW5lSXRlcmF0b3IocmVzb2x2ZXIu
cG9zaXRpb24oKSksIGJsb2NrLnN0eWxlKCkudHJhaWxpbmdXb3JkKCkgPT0gVHJhaWxpbmdXb3Jk
OjpQYXJ0aWFsbHlCYWxhbmNlZCA/IDUgOiAxKQorICAgICAgICAsIG1fYmxvY2soYmxvY2spCisg
ICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5yZW5kZXJlcigpKQorICAgICAgICAsIG1f
bmV4dE9iamVjdChudWxscHRyKQorICAgICAgICAsIG1fY3VycmVudFN0eWxlKG51bGxwdHIpCisg
ICAgICAgICwgbV9ibG9ja1N0eWxlKGJsb2NrLnN0eWxlKCkpCisgICAgICAgICwgbV9saW5lSW5m
byhpbkxpbmVJbmZvKQorICAgICAgICAsIG1fcmVuZGVyVGV4dEluZm8oaW5SZW5kZXJUZXh0SW5m
bykKKyAgICAgICAgLCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUoaW5MYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lKQorICAgICAgICAsIG1fd2lkdGgobGluZVdpZHRoKQorICAgICAgICAsIG1f
Y3VycldTKE5PUk1BTCkKKyAgICAgICAgLCBtX2xhc3RXUyhOT1JNQUwpCisgICAgICAgICwgbV9w
cmVzZXJ2ZXNOZXdsaW5lKGZhbHNlKQorICAgICAgICAsIG1fYXRTdGFydCh0cnVlKQorICAgICAg
ICAsIG1faWdub3JpbmdTcGFjZXMoZmFsc2UpCisgICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZShmYWxzZSkKKyAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTKGZhbHNlKQor
ICAgICAgICAsIG1fYXBwbGllZFN0YXJ0V2lkdGgoYXBwbGllZFN0YXJ0V2lkdGgpCisgICAgICAg
ICwgbV9pbmNsdWRlRW5kV2lkdGgodHJ1ZSkKKyAgICAgICAgLCBtX2F1dG9XcmFwKGZhbHNlKQor
ICAgICAgICAsIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZShmYWxzZSkKKyAgICAgICAgLCBt
X2Zsb2F0c0ZpdE9uTGluZSh0cnVlKQorICAgICAgICAsIG1fY29sbGFwc2VXaGl0ZVNwYWNlKGZh
bHNlKQorICAgICAgICAsIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgobV9saW5lSW5mby5wcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkoKSkKKyAgICAgICAgLCBtX2FsbG93SW1hZ2VzVG9CcmVhayghYmxv
Y2suZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAhYmxvY2suaXNUYWJsZUNlbGwoKSB8fCAh
bV9ibG9ja1N0eWxlLmxvZ2ljYWxXaWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAg
ICwgbV9hdEVuZChmYWxzZSkKKyAgICAgICAgLCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVD
dXJyZW50KGZhbHNlKQorICAgICAgICAsIG1fbGluZU1pZHBvaW50U3RhdGUocmVzb2x2ZXIubWlk
cG9pbnRTdGF0ZSgpKQorICAgIHsKKyAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVC
cm9rZUNsZWFubHkoZmFsc2UpOworICAgIH0KKworICAgIFJlbmRlck9iamVjdCogY3VycmVudE9i
amVjdCgpIHsgcmV0dXJuIG1fY3VycmVudC5yZW5kZXJlcigpOyB9CisgICAgSW5saW5lSXRlcmF0
b3IgbGluZUJyZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKTsgfQor
ICAgIExpbmVXaWR0aCYgbGluZVdpZHRoKCkgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGJvb2wg
YXRFbmQoKSB7IHJldHVybiBtX2F0RW5kOyB9CisKKyAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJy
ZW50T2JqZWN0KCk7CisKKyAgICB2b2lkIGluY3JlbWVudCgpOworCisgICAgdm9pZCBoYW5kbGVC
UihFQ2xlYXImKTsKKyAgICB2b2lkIGhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJl
bmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cyk7CisgICAgdm9pZCBoYW5kbGVGbG9hdCgpOwor
ICAgIHZvaWQgaGFuZGxlRW1wdHlJbmxpbmUoKTsKKyAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7
CisgICAgYm9vbCBoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVk
LCB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOworICAgIGJvb2wgY2FuQnJl
YWtBdFRoaXNQb3NpdGlvbigpOworICAgIHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZO
ZWVkZWQoKTsKKyAgICBJbmxpbmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKKworICAgIHZv
aWQgY2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2Ug
PSBmYWxzZSkKKyAgICB7CisgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdU
cmFpbGluZ1NwYWNlKSB8fCBtX2xhc3RXUyA9PSBOT1dSQVApCisgICAgICAgICAgICBtX2xpbmVC
cmVha0hpc3RvcnkuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbW1pdExpbmVCcmVha0F0
Q3VycmVudFdpZHRoKFJlbmRlck9iamVjdCYgb2JqZWN0LCB1bnNpZ25lZCBvZmZzZXQgPSAwLCBp
bnQgbmV4dEJyZWFrID0gLTEpCisgICAgeworICAgICAgICBtX3dpZHRoLmNvbW1pdCgpOworICAg
ICAgICBtX2xpbmVCcmVha0hpc3RvcnkubW92ZVRvKCZvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFr
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBjbGFzcyBrZWVwcyBhIHNsaWRpbmcg
d2luZG93IG9mIHRoZSBwYXN0IG4gbG9jYXRpb25zIGZvciBhbiBJbmxpbmVJdGVyYXRvci4KKyAg
ICBjbGFzcyBJbmxpbmVJdGVyYXRvckhpc3RvcnkgOiBwcml2YXRlIFZlY3RvcjxJbmxpbmVJdGVy
YXRvciwgMT4geworICAgIHB1YmxpYzoKKyAgICAgICAgSW5saW5lSXRlcmF0b3JIaXN0b3J5KCkg
PSBkZWxldGU7CisgICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeShjb25zdCBJbmxpbmVJdGVy
YXRvciYgaW5pdGlhbCwgc2l6ZV90IGNhcGFjaXR5KQorICAgICAgICAgICAgOiBtX2NhcGFjaXR5
KGNhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoY2FwYWNpdHkgPiAwKTsK
KyAgICAgICAgICAgIHRoaXMtPmFwcGVuZChpbml0aWFsKTsKKyAgICAgICAgfQorCisgICAgICAg
IHZvaWQgcHVzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKT4g
dXBkYXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCF0aGlzLT5pc0VtcHR5KCkp
OworICAgICAgICAgICAgaWYgKG1fY2FwYWNpdHkgIT0gMSkKKyAgICAgICAgICAgICAgICB0aGlz
LT5pbnNlcnQoMCwgSW5saW5lSXRlcmF0b3IodGhpcy0+YXQoMCkpKTsKKyAgICAgICAgICAgIHVw
ZGF0ZXIodGhpcy0+YXQoMCkpOworICAgICAgICAgICAgaWYgKG1fY2FwYWNpdHkgIT0gMSkKKyAg
ICAgICAgICAgICAgICB0aGlzLT5yZXNpemUobV9jYXBhY2l0eSk7CisgICAgICAgIH0KKworICAg
ICAgICB2b2lkIHVwZGF0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoSW5saW5lSXRlcmF0b3ImIG1vZGlm
eU1lKT4gdXBkYXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCF0aGlzLT5pc0Vt
cHR5KCkpOworICAgICAgICAgICAgdXBkYXRlcih0aGlzLT5hdCgwKSk7CisgICAgICAgIH0KKwor
ICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQo
MCkucmVuZGVyZXIoKTsgfQorICAgICAgICB1bnNpZ25lZCBvZmZzZXQoKSBjb25zdCB7IHJldHVy
biB0aGlzLT5hdCgwKS5vZmZzZXQoKTsgfQorICAgICAgICBib29sIGF0VGV4dFBhcmFncmFwaFNl
cGFyYXRvcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLmF0VGV4dFBhcmFncmFwaFNlcGFy
YXRvcigpOyB9CisgICAgICAgIFVDaGFyIHByZXZpb3VzSW5TYW1lTm9kZSgpIGNvbnN0IHsgcmV0
dXJuIHRoaXMtPmF0KDApLnByZXZpb3VzSW5TYW1lTm9kZSgpOyB9CisgICAgICAgIGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBnZXQoc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KGkpOyB9
OworICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgY3VycmVudCgpIGNvbnN0IHsgcmV0dXJu
IGdldCgwKTsgfQorICAgICAgICBzaXplX3QgaGlzdG9yeUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJu
IHRoaXMtPnNpemUoKTsgfQorCisgICAgICAgIHZvaWQgbW92ZVRvKFJlbmRlck9iamVjdCogb2Jq
ZWN0LCB1bnNpZ25lZCBvZmZzZXQsIGludCBuZXh0QnJlYWsgPSAtMSkKKyAgICAgICAgeworICAg
ICAgICAgICAgcHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAg
ICAgICAgbW9kaWZ5TWUubW92ZVRvKG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOworICAgICAg
ICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGluY3JlbWVudCgpCisgICAgICAg
IHsKKyAgICAgICAgICAgIHVwZGF0ZShbXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAg
ICAgICAgICAgICAgICBtb2RpZnlNZS5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIH0pOworICAg
ICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1
c2goW10oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgbW9kaWZ5
TWUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBjb25zdCBzaXplX3QgbV9jYXBhY2l0eTsKKyAgICB9OworCisgICAgTGluZUJyZWFr
ZXImIG1fbGluZUJyZWFrZXI7CisgICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29sdmVyOwor
CisgICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OworICAgIElubGluZUl0ZXJhdG9ySGlzdG9y
eSBtX2xpbmVCcmVha0hpc3Rvcnk7CisgICAgSW5saW5lSXRlcmF0b3IgbV9zdGFydE9mSWdub3Jl
ZFNwYWNlczsKKworICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKKyAgICBSZW5kZXJPYmpl
Y3QqIG1fbGFzdE9iamVjdDsKKyAgICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVjdDsKKworICAg
IGNvbnN0IFJlbmRlclN0eWxlKiBtX2N1cnJlbnRTdHlsZTsKKworICAgIC8vIEZpcmVmb3ggYW5k
IE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGlu
c2lkZSBpdCB1bmRlcgorICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3Jk
ZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklFIHJlbmRlcmluZ3MpLgorICAgIC8vIE5vdCBzdXBwb3J0
aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVz
LiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikKKyAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxlOwor
CisgICAgTGluZUluZm8mIG1fbGluZUluZm87CisKKyAgICBSZW5kZXJUZXh0SW5mbyYgbV9yZW5k
ZXJUZXh0SW5mbzsKKworICAgIEZsb2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmU7CisKKyAgICBMaW5lV2lkdGggbV93aWR0aDsKKworICAgIEVXaGl0ZVNwYWNlIG1fY3Vy
cldTOworICAgIEVXaGl0ZVNwYWNlIG1fbGFzdFdTOworCisgICAgYm9vbCBtX3ByZXNlcnZlc05l
d2xpbmU7CisgICAgYm9vbCBtX2F0U3RhcnQ7CisKKyAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVz
ZWQgb25seSBpZiB3aGl0ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1cyB3
aGV0aGVyCisgICAgLy8gb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVzcGFj
ZS4KKyAgICBib29sIG1faWdub3JpbmdTcGFjZXM7CisKKyAgICAvLyBUaGlzIHZhcmlhYmxlIHRy
YWNrcyB3aGV0aGVyIHRoZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFjZS4g
V2UgdXNlCisgICAgLy8gdGhpcyB0byBkZXRlY3Qgd2hlbiB3ZSBlbmNvdW50ZXIgYSBzZWNvbmQg
c3BhY2Ugc28gd2Uga25vdyB3ZSBoYXZlIHRvIHRlcm1pbmF0ZQorICAgIC8vIGEgcnVuLgorICAg
IGJvb2wgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKyAgICBib29sIG1fY3VycmVudENoYXJh
Y3RlcklzV1M7CisgICAgYm9vbCBtX2FwcGxpZWRTdGFydFdpZHRoOworICAgIGJvb2wgbV9pbmNs
dWRlRW5kV2lkdGg7CisgICAgYm9vbCBtX2F1dG9XcmFwOworICAgIGJvb2wgbV9hdXRvV3JhcFdh
c0V2ZXJUcnVlT25MaW5lOworICAgIGJvb2wgbV9mbG9hdHNGaXRPbkxpbmU7CisgICAgYm9vbCBt
X2NvbGxhcHNlV2hpdGVTcGFjZTsKKyAgICBib29sIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGg7Cisg
ICAgYm9vbCBtX2FsbG93SW1hZ2VzVG9CcmVhazsKKyAgICBib29sIG1fYXRFbmQ7CisgICAgYm9v
bCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50OworCisgICAgTGluZU1pZHBvaW50
U3RhdGUmIG1fbGluZU1pZHBvaW50U3RhdGU7CisKKyAgICBUcmFpbGluZ09iamVjdHMgbV90cmFp
bGluZ09iamVjdHM7Cit9OworCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxp
emVGb3JDdXJyZW50T2JqZWN0KCkKK3sKKyAgICBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVD
dXJyZW50ID0gISFtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKTsKKworICAgIG1fY3VycmVudFN0
eWxlID0gJm1fY3VycmVudC5yZW5kZXJlcigpLT5zdHlsZSgpOyAvLyBGSVhNRTogU2hvdWxkIHRo
aXMgYmUgJmxpbmVTdHlsZSgqbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fbGluZUluZm8pOyA/CisK
KyAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOworCisgICAgbV9uZXh0T2JqZWN0ID0gYmlkaU5l
eHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBtX2N1cnJlbnQucmVuZGVyZXIoKSk7Cisg
ICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRPYmplY3QtPnBhcmVudCgpICYmICFtX25leHRP
YmplY3QtPnBhcmVudCgpLT5pc0Rlc2NlbmRhbnRPZihtX2N1cnJlbnQucmVuZGVyZXIoKS0+cGFy
ZW50KCkpKQorICAgICAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IHRydWU7CisKKyAgICBtX2N1cnJX
UyA9IG1fY3VycmVudC5yZW5kZXJlcigpLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQucmVuZGVy
ZXIoKS0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9jdXJyZW50U3R5bGUtPndo
aXRlU3BhY2UoKTsKKyAgICBtX2xhc3RXUyA9IG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpID8g
bV9sYXN0T2JqZWN0LT5wYXJlbnQoKS0+c3R5bGUoKS53aGl0ZVNwYWNlKCkgOiBtX2xhc3RPYmpl
Y3QtPnN0eWxlKCkud2hpdGVTcGFjZSgpOworCisgICAgbV9hdXRvV3JhcCA9IFJlbmRlclN0eWxl
OjphdXRvV3JhcChtX2N1cnJXUyk7CisgICAgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0g
bV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IG1fYXV0b1dyYXA7CisKKyAgICBtX3ByZXNl
cnZlc05ld2xpbmUgPSBtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNTVkdJbmxpbmVUZXh0KCkgPyBm
YWxzZSA6IFJlbmRlclN0eWxlOjpwcmVzZXJ2ZU5ld2xpbmUobV9jdXJyV1MpOworCisgICAgbV9j
b2xsYXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKG1fY3Vy
cldTKTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjppbmNyZW1lbnQoKQorewor
ICAgIC8vIENsZWFyIG91dCBvdXIgY2hhcmFjdGVyIHNwYWNlIGJvb2wsIHNpbmNlIGlubGluZSA8
cHJlPnMgZG9uJ3QgY29sbGFwc2Ugd2hpdGVzcGFjZQorICAgIC8vIHdpdGggYWRqYWNlbnQgaW5s
aW5lIG5vcm1hbC9ub3dyYXAgc3BhbnMuCisgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSkK
KyAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworCisgICAgbV9jdXJy
ZW50Lm1vdmVUb1N0YXJ0T2YobV9uZXh0T2JqZWN0KTsKKyAgICBtX2F0U3RhcnQgPSBmYWxzZTsK
K30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVCUihFQ2xlYXImIGNsZWFy
KQoreworICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSkgeworICAgICAgICBSZW5kZXJPYmpl
Y3QqIGJyID0gbV9jdXJyZW50LnJlbmRlcmVyKCk7CisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9y
eS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgIG1vZGlm
eU1lLm1vdmVUb1N0YXJ0T2YoYnIpOworICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7
CisgICAgICAgIH0pOworCisgICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEgbGluZSwg
c28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAorICAgICAgICAvLyBhd2F5LiBBbHNv
LCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9lcyBub3QKKyAg
ICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBpZiB0aGUgcHJl
dmlvdXMgbGluZSBicm9rZQorICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2UgdGhlIDxicj4g
aGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCisgICAgICAgIC8vIGVtcHR5IG9y
IG5vdC4KKyAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCisgICAgICAgICAgICBt
X2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOworICAgICAgICBt
X3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKworICAgICAgICAvLyBBIDxicj4gd2l0aCBjbGVhcmFu
Y2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxvdyBpdCBnZXQg
ZGlydGllZCBsYXRlciBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3IgZmxvYXRzIHRv
IGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9yaW5nIHRoZW0g
YW5kIGFkZCBhCisgICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCisgICAgICAgIGlmICht
X2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9IENOT05FKQorICAg
ICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5lbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNw
YWNlcyhicik7CisgICAgICAgIC8vIElmIHdlIHdlcmUgcHJlY2VkZWQgYnkgY29sbGFwc2luZyBz
cGFjZSBhbmQgYXJlIGluIGEgcmlnaHQtYWxpZ25lZCBjb250YWluZXIgd2UgbmVlZCB0byBlbnN1
cmUgdGhlIHNwYWNlIGdldHMKKyAgICAgICAgLy8gY29sbGFwc2VkIGF3YXkgc28gdGhhdCBpdCBk
b2Vzbid0IHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIGNvbnRhaW5lcidzIHJpZ2h0LWhhbmQg
ZWRnZS4KKyAgICAgICAgLy8gRklYTUU6IERvIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFp
bmVyJ3MgYWxpZ25tZW50IC0gd2lsbCByZXF1aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0
IHJlc3VsdHMuCisgICAgICAgIGVsc2UgaWYgKG1faWdub3JpbmdTcGFjZXMgJiYgKG1fYmxvY2tT
dHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8fCBtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0g
V0VCS0lUX1JJR0hUKSkKKyAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9y
aW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJl
bnQub2Zmc2V0KCkpKTsKKworICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQorICAg
ICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgbV9h
dEVuZCA9IHRydWU7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5T
dGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQoreworICAgIHJldHVybiBjaGlsZC5tYXJn
aW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwor
fQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0IFJlbmRl
cklubGluZSYgY2hpbGQpCit7CisgICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsgY2hpbGQu
cGFkZGluZ0VuZCgpICsgY2hpbGQuYm9yZGVyRW5kKCk7Cit9CisKK2lubGluZSBib29sIHNob3Vs
ZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyT2JqZWN0KiBjaGlsZCkKK3sKKyAgICBpZiAo
IWNoaWxkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBXaGVuIGRlY2lkaW5nIHdoZXRo
ZXIgd2UncmUgYXQgdGhlIGVkZ2Ugb2YgYW4gaW5saW5lLCBhZGphY2VudCBjb2xsYXBzZWQgd2hp
dGVzcGFjZSBpcyB0aGUgc2FtZSBhcyBubyBzaWJsaW5nIGF0IGFsbC4KKyAgICBpZiAoaXM8UmVu
ZGVyVGV4dD4oKmNoaWxkKSAmJiAhZG93bmNhc3Q8UmVuZGVyVGV4dD4oKmNoaWxkKS50ZXh0TGVu
Z3RoKCkpCisgICAgICAgIHJldHVybiB0cnVlOworI2lmIEVOQUJMRShDU1NfQk9YX0RFQ09SQVRJ
T05fQlJFQUspCisgICAgaWYgKGlzPFJlbmRlckxpbmVCcmVhaz4oKmNoaWxkKSAmJiBjaGlsZC0+
cGFyZW50KCktPnN0eWxlKCkuYm94RGVjb3JhdGlvbkJyZWFrKCkgPT0gRENMT05FKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIFJl
bmRlck9iamVjdCogcHJldmlvdXNJbkZsb3dTaWJsaW5nKFJlbmRlck9iamVjdCogY2hpbGQpCit7
CisgICAgZG8geworICAgICAgICBjaGlsZCA9IGNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAg
ICB9IHdoaWxlIChjaGlsZCAmJiBjaGlsZC0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOworICAg
IHJldHVybiBjaGlsZDsKK30KKworaW5saW5lIExheW91dFVuaXQgaW5saW5lTG9naWNhbFdpZHRo
KFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVlLCBib29sIGNo
ZWNrRW5kRWRnZSA9IHRydWUpCit7CisgICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsKKyAgICBM
YXlvdXRVbml0IGV4dHJhV2lkdGggPSAwOworICAgIFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGNo
aWxkLT5wYXJlbnQoKTsKKyAgICB3aGlsZSAoaXM8UmVuZGVySW5saW5lPigqcGFyZW50KSAmJiBs
aW5lRGVwdGgrKyA8IGNNYXhMaW5lRGVwdGgpIHsKKyAgICAgICAgY29uc3QgYXV0byYgcGFyZW50
QXNSZW5kZXJJbmxpbmUgPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpwYXJlbnQpOworICAgICAg
ICBpZiAoIWlzRW1wdHlJbmxpbmUocGFyZW50QXNSZW5kZXJJbmxpbmUpKSB7CisgICAgICAgICAg
ICBjaGVja1N0YXJ0RWRnZSA9IGNoZWNrU3RhcnRFZGdlICYmIHNob3VsZEFkZEJvcmRlclBhZGRp
bmdNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5nKGNoaWxkKSk7CisgICAgICAgICAgICBpZiAo
Y2hlY2tTdGFydEVkZ2UpCisgICAgICAgICAgICAgICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRk
aW5nTWFyZ2luU3RhcnQocGFyZW50QXNSZW5kZXJJbmxpbmUpOworICAgICAgICAgICAgY2hlY2tF
bmRFZGdlID0gY2hlY2tFbmRFZGdlICYmIHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oY2hp
bGQtPm5leHRTaWJsaW5nKCkpOworICAgICAgICAgICAgaWYgKGNoZWNrRW5kRWRnZSkKKyAgICAg
ICAgICAgICAgICBleHRyYVdpZHRoICs9IGJvcmRlclBhZGRpbmdNYXJnaW5FbmQocGFyZW50QXNS
ZW5kZXJJbmxpbmUpOworICAgICAgICAgICAgaWYgKCFjaGVja1N0YXJ0RWRnZSAmJiAhY2hlY2tF
bmRFZGdlKQorICAgICAgICAgICAgICAgIHJldHVybiBleHRyYVdpZHRoOworICAgICAgICB9Cisg
ICAgICAgIGNoaWxkID0gcGFyZW50OworICAgICAgICBwYXJlbnQgPSBjaGlsZC0+cGFyZW50KCk7
CisgICAgfQorICAgIHJldHVybiBleHRyYVdpZHRoOworfQorCitpbmxpbmUgdm9pZCBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBw
b3NpdGlvbmVkT2JqZWN0cykKK3sKKyAgICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXNu
J3QgYW4gaW5saW5lIHR5cGUsIHRoZW4gd2UgY2FuCisgICAgLy8gZ28gYWhlYWQgYW5kIGRldGVy
bWluZSBvdXIgc3RhdGljIGlubGluZSBwb3NpdGlvbiBub3cuCisgICAgYXV0byYgYm94ID0gZG93
bmNhc3Q8UmVuZGVyQm94PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOworICAgIGJvb2wgaXNJbmxp
bmVUeXBlID0gYm94LnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7CisgICAg
aWYgKCFpc0lubGluZVR5cGUpCisgICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRp
b25Gb3JDaGlsZChib3gsIG1fYmxvY2subG9naWNhbEhlaWdodCgpLCBtX2Jsb2NrLnN0YXJ0T2Zm
c2V0Rm9yQ29udGVudChtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSkpOworICAgIGVsc2UgeworICAg
ICAgICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXMgYW4gSU5MSU5FIHR5cGUsIHRoZW4g
d2UgY2FuIGdvIGFoZWFkCisgICAgICAgIC8vIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyB5IHBv
c2l0aW9uIG5vdy4KKyAgICAgICAgYm94LmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24o
bV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpOworICAgIH0KKworICAgIC8vIElmIHdlJ3JlIGlnbm9y
aW5nIHNwYWNlcywgd2UgaGF2ZSB0byBzdG9wIGFuZCBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZAor
ICAgIC8vIHRoZW4gc3RhcnQgaWdub3Jpbmcgc3BhY2VzIGFnYWluLgorICAgIGlmIChpc0lubGlu
ZVR5cGUgfHwgYm94LmNvbnRhaW5lcigpLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgIGlm
IChtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5lbnN1
cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcygmYm94KTsKKyAgICAgICAgbV90cmFpbGluZ09i
amVjdHMuYXBwZW5kQm94SWZOZWVkZWQoJmJveCk7CisgICAgfSBlbHNlCisgICAgICAgIHBvc2l0
aW9uZWRPYmplY3RzLmFwcGVuZCgmYm94KTsKKworICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRX
aWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoJmJveCkpOworICAgIC8vIFJlc2V0IHByaW9yIGxpbmUg
YnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJl
YWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkKK3sKKyAgICBhdXRvJiBmbG9hdEJveCA9IGRvd25jYXN0
PFJlbmRlckJveD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKKyAgICBGbG9hdGluZ09iamVjdCog
ZmxvYXRpbmdPYmplY3QgPSBtX2xpbmVCcmVha2VyLmluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0
Qm94KTsKKyAgICAvLyBjaGVjayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUuCisgICAg
Ly8gSWYgaXQgZG9lcywgcG9zaXRpb24gaXQgbm93LCBvdGhlcndpc2UsIHBvc2l0aW9uCisgICAg
Ly8gaXQgYWZ0ZXIgbW92aW5nIHRvIG5leHQgbGluZSAoaW4gY2xlYXJGbG9hdHMoKSBmdW5jKQor
ICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAmJiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNsdWRpbmdU
cmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5sb2dpY2FsV2lkdGhGb3JGbG9hdChmbG9hdGluZ09i
amVjdCkpKSB7CisgICAgICAgIG1fbGluZUJyZWFrZXIucG9zaXRpb25OZXdGbG9hdE9uTGluZShm
bG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBt
X3dpZHRoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpID09IG1f
Y3VycmVudC5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJyZWFrSGlz
dG9yeS5vZmZzZXQoKSk7CisgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50
KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgbV9mbG9hdHNGaXRPbkxpbmUgPSBm
YWxzZTsKKyAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMs
IHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5UIENIQVJBQ1RFUikgZm9yIGZsb2F0aW5n
IGVsZW1lbnQuCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0
ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rlcik7Cit9CisKKy8vIFRoaXMgaXMgY3Vy
cmVudGx5IGp1c3QgdXNlZCBmb3IgbGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhhdCBo
YXZlIGxpbmUgYm94ZXMuIE5laXRoZXIgc2hvdWxkCisvLyBoYXZlIGFuIGVmZmVjdCBvbiB3aGl0
ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS4KK2lubGluZSBib29sIHNob3VsZFNraXBX
aGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBSZW5kZXJP
YmplY3QqIG8sIExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSkKK3sKKyAgICBS
ZW5kZXJPYmplY3QqIG5leHQgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2NrLCBv
KTsKKyAgICB3aGlsZSAobmV4dCAmJiBuZXh0LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlv
bmVkKCkpCisgICAgICAgIG5leHQgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2Nr
LCBuZXh0KTsKKworICAgIGlmIChpczxSZW5kZXJUZXh0PihuZXh0KSAmJiBkb3duY2FzdDxSZW5k
ZXJUZXh0PigqbmV4dCkudGV4dExlbmd0aCgpID4gMCkgeworICAgICAgICBSZW5kZXJUZXh0JiBu
ZXh0VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KCpuZXh0KTsKKyAgICAgICAgVUNoYXIgbmV4
dENoYXIgPSBuZXh0VGV4dC5jaGFyYWN0ZXJBdCgwKTsKKyAgICAgICAgaWYgKG5leHRUZXh0LnN0
eWxlKCkuaXNDb2xsYXBzaWJsZVdoaXRlU3BhY2UobmV4dENoYXIpKSB7CisgICAgICAgICAgICBs
aW5lTWlkcG9pbnRTdGF0ZS5zdGFydElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKG51bGxw
dHIsIG8sIDApKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZUVtcHR5SW5saW5lKCkKK3sKKyAgICBSZW5kZXJJbmxpbmUmIGZsb3dCb3ggPSBkb3duY2Fz
dDxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7CisKKyAgICAvLyBUaGlzIHNo
b3VsZCBvbmx5IGVuZCB1cCBiZWluZyBjYWxsZWQgb24gZW1wdHkgaW5saW5lcworICAgIEFTU0VS
VChpc0VtcHR5SW5saW5lKGZsb3dCb3gpKTsKKworICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5l
IGZsb3dzIGhhdmUgbGluZSBib3hlcywgaWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2Vz
LCB3ZSBuZWVkCisgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRo
aXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KKyAgICAvLyBJ
ZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVo
YXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZAorICAgIC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4K
KyAgICBib29sIHJlcXVpcmVzTGluZUJveCA9IGFsd2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94
KTsKKyAgICBpZiAocmVxdWlyZXNMaW5lQm94IHx8IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQo
Zmxvd0JveCwgbV9saW5lSW5mbykpIHsKKyAgICAgICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQg
b25seSBoYXMgbGluZS1oZWlnaHQsIHZlcnRpY2FsLWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxs
IG9ubHkgZ2V0IGEKKyAgICAgICAgLy8gbGluZSBib3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2Yg
dGhlIGxpbmUgaWYgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgaXMgbm90IGVtcHR5LgorICAgICAgICBp
ZiAocmVxdWlyZXNMaW5lQm94KQorICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxz
ZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsK
KyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisgICAgICAgICAgICBtX2xp
bmVNaWRwb2ludFN0YXRlLmVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKG1fY3VycmVu
dC5yZW5kZXJlcigpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5bGUuY29sbGFwc2VX
aGl0ZVNwYWNlKCkgJiYgbV9yZXNvbHZlci5wb3NpdGlvbigpLnJlbmRlcmVyKCkgPT0gbV9jdXJy
ZW50LnJlbmRlcmVyKCkKKyAgICAgICAgICAgICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJT
dGFydE9iamVjdChtX2Jsb2NrLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9saW5lTWlkcG9pbnRT
dGF0ZSkpIHsKKyAgICAgICAgICAgIC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0
IGlnbm9yaW5nIHNwYWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKKyAgICAgICAgICAgIC8vIGFk
ZGl0aW9uYWwgc3BhY2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgbV9jdXJyZW50Q2hh
cmFjdGVySXNXUyA9IHRydWU7CisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJ
Zk5lZWRlZCgmZmxvd0JveCk7CisgICAgfQorCisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSkgKyBib3JkZXJQYWRk
aW5nTWFyZ2luU3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGZsb3dCb3gp
KTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBsYWNlZCgpCit7
CisgICAgYXV0byYgcmVwbGFjZWRCb3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQu
cmVuZGVyZXIoKSk7CisKKyAgICBpZiAobV9hdFN0YXJ0KQorICAgICAgICBtX3dpZHRoLnVwZGF0
ZUF2YWlsYWJsZVdpZHRoKHJlcGxhY2VkQm94LmxvZ2ljYWxIZWlnaHQoKSk7CisKKyAgICAvLyBC
cmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFj
ZS4KKyAgICBpZiAoKG1fYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdT
KSkgJiYgKCFtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNU
b0JyZWFrKQorICAgICAgICAmJiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc1J1YnlSdW4oKSB8
fCBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihtX2N1cnJlbnQucmVuZGVyZXIoKSktPmNhbkJyZWFr
QmVmb3JlKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvcikpKSB7CisgICAgICAg
IGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSk7Cisg
ICAgfQorCisgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgIG1fbGluZU1pZHBvaW50
U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5k
ZXJlcigpLCAwKSk7CisKKyAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywg
Jm1fd2lkdGgpOworICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlID0gZmFsc2U7CisgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IGZh
bHNlOworICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisKKyAgICAvLyBPcHRpbWl6ZSBm
b3IgYSBjb21tb24gY2FzZS4gSWYgd2UgY2FuJ3QgZmluZCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBs
aXN0CisgICAgLy8gaXRlbSwgdGhlbiB0aGlzIGlzIGFsbCBtb290LgorICAgIExheW91dFVuaXQg
cmVwbGFjZWRMb2dpY2FsV2lkdGggPSBtX2Jsb2NrLmxvZ2ljYWxXaWR0aEZvckNoaWxkKHJlcGxh
Y2VkQm94KSArIG1fYmxvY2subWFyZ2luU3RhcnRGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Js
b2NrLm1hcmdpbkVuZEZvckNoaWxkKHJlcGxhY2VkQm94KSArIGlubGluZUxvZ2ljYWxXaWR0aCht
X2N1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgaWYgKGlzPFJlbmRlckxpc3RNYXJrZXI+KCptX2N1
cnJlbnQucmVuZGVyZXIoKSkpIHsKKyAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdo
aXRlU3BhY2UoKSAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9j
aywgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7CisgICAgICAg
ICAgICAvLyBMaWtlIHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMg
dG8gbWFrZSBzdXJlIHRoYXQgYW55CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3
ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxz
ZTsKKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAgICB9CisgICAg
ICAgIGlmIChkb3duY2FzdDxSZW5kZXJMaXN0TWFya2VyPigqbV9jdXJyZW50LnJlbmRlcmVyKCkp
LmlzSW5zaWRlKCkpCisgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVw
bGFjZWRMb2dpY2FsV2lkdGgpOworICAgIH0gZWxzZQorICAgICAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOworICAgIGlmIChpczxSZW5kZXJSdWJ5
UnVuPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpKSB7CisgICAgICAgIG1fd2lkdGguYXBwbHlPdmVy
aGFuZyhkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihtX2N1cnJlbnQucmVuZGVyZXIoKSksIG1fbGFz
dE9iamVjdCwgbV9uZXh0T2JqZWN0KTsKKyAgICAgICAgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4o
bV9jdXJyZW50LnJlbmRlcmVyKCkpLT51cGRhdGVQcmlvckNvbnRleHRGcm9tQ2FjaGVkQnJlYWtJ
dGVyYXRvcihtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVy
cywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFj
ZWQgZWxlbWVudC4KKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9y
LnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rlcik7CisgICAgfQorfQorCitp
bmxpbmUgZmxvYXQgZmlyc3RQb3NpdGl2ZVdpZHRoKGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3JkTWVhc3Vy
ZW1lbnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnRzW2ldLndp
ZHRoID4gMCkKKyAgICAgICAgICAgIHJldHVybiB3b3JkTWVhc3VyZW1lbnRzW2ldLndpZHRoOwor
ICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW5saW5lIGJvb2wgaXRlcmF0b3JJc0JleW9uZEVu
ZE9mUmVuZGVyQ29tYmluZVRleHQoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIsIFJlbmRlckNv
bWJpbmVUZXh0JiByZW5kZXJlcikKK3sKKyAgICByZXR1cm4gaXRlci5yZW5kZXJlcigpID09ICZy
ZW5kZXJlciAmJiBpdGVyLm9mZnNldCgpID49IHJlbmRlcmVyLnRleHRMZW5ndGgoKTsKK30KKwor
aW5saW5lIHZvaWQgbmV4dENoYXJhY3RlcihVQ2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXIm
IGxhc3RDaGFyYWN0ZXIsIFVDaGFyJiBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpCit7CisgICAgc2Vj
b25kVG9MYXN0Q2hhcmFjdGVyID0gbGFzdENoYXJhY3RlcjsKKyAgICBsYXN0Q2hhcmFjdGVyID0g
Y3VycmVudENoYXJhY3RlcjsKK30KKworLy8gRklYTUU6IERvbid0IGxldCBjb3VudGVycyBtYXJr
IHRoZW1zZWx2ZXMgYXMgbmVlZGluZyBwcmVmIHdpZHRoIHJlY2FsY3MgZHVyaW5nIGxheW91dAor
Ly8gc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGhhY2suCitpbmxpbmUgdm9pZCB1cGRhdGVDb3VudGVy
SWZOZWVkZWQoUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCkKK3sKKyAgICBpZiAoIXJlbmRlclRleHQu
cHJlZmVycmVkTG9naWNhbFdpZHRoc0RpcnR5KCkgfHwgIWlzPFJlbmRlckNvdW50ZXI+KHJlbmRl
clRleHQpKQorICAgICAgICByZXR1cm47CisgICAgZG93bmNhc3Q8UmVuZGVyQ291bnRlcj4ocmVu
ZGVyVGV4dCkudXBkYXRlQ291bnRlcigpOworfQorCitpbmxpbmUgZmxvYXQgbWVhc3VyZUh5cGhl
bldpZHRoKFJlbmRlclRleHQmIHJlbmRlcmVyLCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgSGFz
aFNldDxjb25zdCBGb250Kj4qIGZhbGxiYWNrRm9udHMgPSAwKQoreworICAgIGNvbnN0IFJlbmRl
clN0eWxlJiBzdHlsZSA9IHJlbmRlcmVyLnN0eWxlKCk7CisgICAgcmV0dXJuIGZvbnQud2lkdGgo
UmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnJlbmRlcmVyLCBmb250LCBzdHlsZS5oeXBo
ZW5TdHJpbmcoKS5zdHJpbmcoKSwgc3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsKK30KKworQUxXQVlT
X0lOTElORSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCYgdGV4dCwgdW5zaWduZWQgZnJvbSwg
dW5zaWduZWQgbGVuLCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBp
c0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNoU2V0PGNvbnN0IEZvbnQq
PiYgZmFsbGJhY2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gbnVsbHB0cikKK3sKKyAgICBj
b25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LnN0eWxlKCk7CisKKyAgICBHbHlwaE92ZXJm
bG93IGdseXBoT3ZlcmZsb3c7CisgICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVu
ID09IHRleHQudGV4dExlbmd0aCgpKSB8fCBzdHlsZS5oYXNUZXh0Q29tYmluZSgpKQorICAgICAg
ICByZXR1cm4gdGV4dC53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3MsICZmYWxsYmFja0ZvbnRz
LCAmZ2x5cGhPdmVyZmxvdyk7CisKKyAgICBpZiAobGF5b3V0KQorICAgICAgICByZXR1cm4gRm9u
dENhc2NhZGU6OndpZHRoKCpsYXlvdXQsIGZyb20sIGxlbiwgJmZhbGxiYWNrRm9udHMpOworCisg
ICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bigmdGV4dCwgZm9u
dCwgJnRleHQsIGZyb20sIGxlbiwgc3R5bGUpOworICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3Ro
KHRleHQudGV4dExlbmd0aCgpIC0gZnJvbSk7CisgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVu
Z3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKKworICAgIHJ1bi5zZXRDaGFyYWN0ZXJTY2FuRm9yQ29k
ZVBhdGgoIXRleHQuY2FuVXNlU2ltcGxlRm9udENvZGVQYXRoKCkpOworICAgIHJ1bi5zZXRUYWJT
aXplKCFjb2xsYXBzZVdoaXRlU3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CisgICAgcnVuLnNldFhQ
b3MoeFBvcyk7CisgICAgcmV0dXJuIGZvbnQud2lkdGgocnVuLCAmZmFsbGJhY2tGb250cywgJmds
eXBoT3ZlcmZsb3cpOworfQorCisvLyBBZGRpbmcgYSBwYWlyIG9mIG1pZHBvaW50cyBiZWZvcmUg
YSBjaGFyYWN0ZXIgd2lsbCBzcGxpdCBpdCBvdXQgaW50byBhIG5ldyBsaW5lIGJveC4KK2lubGlu
ZSB2b2lkIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KExpbmVNaWRwb2ludFN0YXRlJiBsaW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3ImIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IpCit7
CisgICAgSW5saW5lSXRlcmF0b3IgbWlkcG9pbnQoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5y
ZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNldCgpKTsKKyAgICBsaW5lTWlk
cG9pbnRTdGF0ZS5zdGFydElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJh
Z3JhcGhTZXBhcmF0b3IucmVuZGVyZXIoKSwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5vZmZzZXQo
KSAtIDEpKTsKKyAgICBsaW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5l
SXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdy
YXBoU2VwYXJhdG9yLm9mZnNldCgpKSk7Cit9CisKK2lubGluZSB2b2lkIHRyeUh5cGhlbmF0aW5n
KFJlbmRlclRleHQmIHRleHQsIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250LCBjb25zdCBBdG9taWNT
dHJpbmcmIGxvY2FsZUlkZW50aWZpZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExp
bmVzLCBpbnQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVm
aXhMaW1pdCwgaW50IG1pbmltdW1TdWZmaXhMaW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNp
Z25lZCBwb3MsIGZsb2F0IHhQb3MsIGludCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0
Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElu
bGluZUl0ZXJhdG9yJiBsaW5lQnJlYWssIGludCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5h
dGVkKQoreworICAgIC8vIE1hcCAnaHlwaGVuYXRlLWxpbWl0LXtiZWZvcmUsYWZ0ZXJ9OiBhdXRv
OycgdG8gMi4KKyAgICB1bnNpZ25lZCBtaW5pbXVtUHJlZml4TGVuZ3RoOworICAgIHVuc2lnbmVk
IG1pbmltdW1TdWZmaXhMZW5ndGg7CisKKyAgICBpZiAobWluaW11bVByZWZpeExpbWl0IDwgMCkK
KyAgICAgICAgbWluaW11bVByZWZpeExlbmd0aCA9IDI7CisgICAgZWxzZQorICAgICAgICBtaW5p
bXVtUHJlZml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmltdW1QcmVmaXhMaW1p
dCk7CisKKyAgICBpZiAobWluaW11bVN1ZmZpeExpbWl0IDwgMCkKKyAgICAgICAgbWluaW11bVN1
ZmZpeExlbmd0aCA9IDI7CisgICAgZWxzZQorICAgICAgICBtaW5pbXVtU3VmZml4TGVuZ3RoID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmltdW1TdWZmaXhMaW1pdCk7CisKKyAgICBpZiAocG9z
IC0gbGFzdFNwYWNlIDw9IG1pbmltdW1TdWZmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0ID49IDAgJiYgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMgPj0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzTGltaXQpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgaHlwaGVuV2lk
dGggPSBtZWFzdXJlSHlwaGVuV2lkdGgodGV4dCwgZm9udCk7CisKKyAgICBmbG9hdCBtYXhQcmVm
aXhXaWR0aCA9IGF2YWlsYWJsZVdpZHRoIC0geFBvcyAtIGh5cGhlbldpZHRoIC0gbGFzdFNwYWNl
V29yZFNwYWNpbmc7CisgICAgLy8gSWYgdGhlIG1heGltdW0gd2lkdGggYXZhaWxhYmxlIGZvciB0
aGUgcHJlZml4IGJlZm9yZSB0aGUgaHlwaGVuIGlzIHNtYWxsLCB0aGVuIGl0IGlzIHZlcnkgdW5s
aWtlbHkKKyAgICAvLyB0aGF0IGFuIGh5cGhlbmF0aW9uIG9wcG9ydHVuaXR5IGV4aXN0cywgc28g
ZG8gbm90IGJvdGhlciB0byBsb29rIGZvciBpdC4KKyAgICBpZiAobWF4UHJlZml4V2lkdGggPD0g
Zm9udC5waXhlbFNpemUoKSAqIDUgLyA0KQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBS
ZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LnN0eWxlKCk7CisgICAgVGV4dFJ1biBydW4gPSBSZW5k
ZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bigmdGV4dCwgZm9udCwgJnRleHQsIGxhc3RTcGFjZSwg
cG9zIC0gbGFzdFNwYWNlLCBzdHlsZSk7CisgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4
dC50ZXh0TGVuZ3RoKCkgLSBsYXN0U3BhY2UpOworICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xl
bmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CisKKyAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VX
aGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkpOworICAgIHJ1bi5zZXRYUG9zKHhQb3MgKyBsYXN0
U3BhY2VXb3JkU3BhY2luZyk7CisKKyAgICB1bnNpZ25lZCBwcmVmaXhMZW5ndGggPSBmb250Lm9m
ZnNldEZvclBvc2l0aW9uKHJ1biwgbWF4UHJlZml4V2lkdGgsIGZhbHNlKTsKKyAgICBpZiAocHJl
Zml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
cHJlZml4TGVuZ3RoID0gbGFzdEh5cGhlbkxvY2F0aW9uKFN0cmluZ1ZpZXcodGV4dC50ZXh0KCkp
LnN1YnN0cmluZyhsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSksIHN0ZDo6bWluKHByZWZpeExl
bmd0aCwgcG9zIC0gbGFzdFNwYWNlIC0gbWluaW11bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJ
ZGVudGlmaWVyKTsKKyAgICBpZiAoIXByZWZpeExlbmd0aCB8fCBwcmVmaXhMZW5ndGggPCBtaW5p
bXVtUHJlZml4TGVuZ3RoKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXaGVuIGxhc3RTcGFj
ZSBpcyBhIHNwYWNlLCB3aGljaCBpdCBhbHdheXMgaXMgZXhjZXB0IHNvbWV0aW1lcyBhdCB0aGUg
YmVnaW5uaW5nIG9mIGEgbGluZSBvciBhZnRlciBjb2xsYXBzZWQKKyAgICAvLyBzcGFjZSwgaXQg
c2hvdWxkIG5vdCBjb3VudCB0b3dhcmRzIGh5cGhlbmF0ZS1saW1pdC1iZWZvcmUuCisgICAgaWYg
KHByZWZpeExlbmd0aCA9PSBtaW5pbXVtUHJlZml4TGVuZ3RoKSB7CisgICAgICAgIFVDaGFyIGNo
YXJhY3RlckF0TGFzdFNwYWNlID0gdGV4dC5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOworICAgICAg
ICBpZiAoY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNl
ID09ICdcbicgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExh
c3RTcGFjZSA9PSBub0JyZWFrU3BhY2UpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgQVNTRVJUKHBvcyAtIGxhc3RTcGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4
TGVuZ3RoKTsKKworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBIYXNoU2V0PGNvbnN0IEZvbnQq
PiBmYWxsYmFja0ZvbnRzOworICAgIGZsb2F0IHByZWZpeFdpZHRoID0gaHlwaGVuV2lkdGggKyB0
ZXh0V2lkdGgodGV4dCwgbGFzdFNwYWNlLCBwcmVmaXhMZW5ndGgsIGZvbnQsIHhQb3MsIGlzRml4
ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRzKSArIGxhc3RTcGFjZVdv
cmRTcGFjaW5nOworICAgIEFTU0VSVCh4UG9zICsgcHJlZml4V2lkdGggPD0gYXZhaWxhYmxlV2lk
dGgpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaXNGaXhlZFBpdGNoKTsKKyNlbmRpZgorCisg
ICAgbGluZUJyZWFrLm1vdmVUbygmdGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0
QnJlYWthYmxlKTsKKyAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgQnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVu
dHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGlu
ZXMpCit7CisgICAgaWYgKCFtX2N1cnJlbnQub2Zmc2V0KCkpCisgICAgICAgIG1fYXBwbGllZFN0
YXJ0V2lkdGggPSBmYWxzZTsKKworICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQgPSBkb3duY2Fz
dDxSZW5kZXJUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOworCisgICAgYm9vbCBpc1NWR1Rl
eHQgPSByZW5kZXJUZXh0LmlzU1ZHSW5saW5lVGV4dCgpOworCisgICAgLy8gSWYgd2UgaGF2ZSBs
ZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4gYXV0b3dyYXAgaW5saW5lIHdoaWxl
IGlnbm9yaW5nIHNwYWNlcworICAgIC8vIHRoZW4gd2UgbmVlZCB0byBtYXJrIHRoZSBzdGFydCBv
ZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFsIGxpbmVicmVhayBub3cuCisgICAg
aWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykgJiYgbV9p
Z25vcmluZ1NwYWNlcykKKyAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgocmVu
ZGVyVGV4dCk7CisKKyAgICBpZiAocmVuZGVyVGV4dC5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkg
JiYgaXM8UmVuZGVyQ29tYmluZVRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgIWRvd25j
YXN0PFJlbmRlckNvbWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpLmlzQ29tYmluZWQo
KSkgeworICAgICAgICBhdXRvJiBjb21iaW5lUmVuZGVyZXIgPSBkb3duY2FzdDxSZW5kZXJDb21i
aW5lVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKKyAgICAgICAgY29tYmluZVJlbmRlcmVy
LmNvbWJpbmVUZXh0KCk7CisgICAgICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVyJ3Mg
dGV4dCBtYXkgaGF2ZSBjaGFuZ2VkLiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRpb25z
CisgICAgICAgIGlmIChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xp
bmVCcmVha0hpc3RvcnkuY3VycmVudCgpLCBjb21iaW5lUmVuZGVyZXIpKSB7CisgICAgICAgICAg
ICBBU1NFUlQoaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZl
ci5wb3NpdGlvbigpLCBjb21iaW5lUmVuZGVyZXIpKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFr
SGlzdG9yeS5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIG1fcmVzb2x2ZXIuaW5jcmVtZW50KCk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSBsaW5l
U3R5bGUocmVuZGVyVGV4dCwgbV9saW5lSW5mbyk7CisgICAgY29uc3QgRm9udENhc2NhZGUmIGZv
bnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOworICAgIGJvb2wgaXNGaXhlZFBpdGNoID0gZm9udC5p
c0ZpeGVkUGl0Y2goKTsKKyAgICBib29sIGNhbkh5cGhlbmF0ZSA9IHN0eWxlLmh5cGhlbnMoKSA9
PSBIeXBoZW5zQXV0byAmJiBXZWJDb3JlOjpjYW5IeXBoZW5hdGUoc3R5bGUubG9jYWxlKCkpOwor
CisgICAgdW5zaWduZWQgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm9mZnNldCgpOworICAgIGZsb2F0
IHdvcmRTcGFjaW5nID0gbV9jdXJyZW50U3R5bGUtPmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmco
KTsKKyAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7CisgICAgZmxvYXQgd29yZFNw
YWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOworCisgICAgZmxvYXQgd3JhcFcgPSBtX3dpZHRo
LnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVy
ZXIoKSwgIW1fYXBwbGllZFN0YXJ0V2lkdGgsIHRydWUpOworICAgIGZsb2F0IGNoYXJXaWR0aCA9
IDA7CisgICAgYm9vbCBicmVha05CU1AgPSBtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5u
YnNwTW9kZSgpID09IFNQQUNFOworICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgd3Jh
cCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmx5IGlmIGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9y
ZSB0aGUgd29yZCwKKyAgICAvLyB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlz
IHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZSwgdGhhdCBpcywgaWYgfHd8IGlzIHplcm8uCisg
ICAgYm9vbCBicmVha1dvcmRzID0gbV9jdXJyZW50U3R5bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1f
YXV0b1dyYXAgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJF
KTsKKyAgICBib29sIG1pZFdvcmRCcmVhayA9IGZhbHNlOworICAgIGJvb2wgYnJlYWtBbGwgPSBt
X2N1cnJlbnRTdHlsZS0+d29yZEJyZWFrKCkgPT0gQnJlYWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRv
V3JhcDsKKyAgICBmbG9hdCBoeXBoZW5XaWR0aCA9IDA7CisgICAgYm9vbCBpc0xvb3NlQ0pLTW9k
ZSA9IGZhbHNlOworCisgICAgaWYgKGlzU1ZHVGV4dCkgeworICAgICAgICBicmVha1dvcmRzID0g
ZmFsc2U7CisgICAgICAgIGJyZWFrQWxsID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fcmVu
ZGVyVGV4dEluZm8ubV90ZXh0ICE9ICZyZW5kZXJUZXh0KSB7CisgICAgICAgIHVwZGF0ZUNvdW50
ZXJJZk5lZWRlZChyZW5kZXJUZXh0KTsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX3RleHQg
PSAmcmVuZGVyVGV4dDsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsK
KyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KCZy
ZW5kZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7
CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmlu
Z0FuZFJlbGVhc2VJdGVyYXRvcihyZW5kZXJUZXh0LnRleHQoKSwgc3R5bGUubG9jYWxlKCksIG1h
cExpbmVCcmVha1RvSXRlcmF0b3JNb2RlKG1fYmxvY2tTdHlsZS5saW5lQnJlYWsoKSkpOworICAg
ICAgICBpc0xvb3NlQ0pLTW9kZSA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRv
ci5pc0xvb3NlQ0pLTW9kZSgpOworICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5mby5tX2xh
eW91dCAmJiBtX3JlbmRlclRleHRJbmZvLm1fZm9udCAhPSAmZm9udCkgeworICAgICAgICBtX3Jl
bmRlclRleHRJbmZvLm1fZm9udCA9ICZmb250OworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1f
bGF5b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQoJnJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdp
ZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICB9CisKKyAgICBUZXh0TGF5b3V0KiB0
ZXh0TGF5b3V0ID0gbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dC5nZXQoKTsKKworICAgIC8vIE5v
bi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5nIGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3Qg
dXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBtZWFzdXJlCisgICAgLy8gd29yZHMgd2l0aCB0aGVpciB0
cmFpbGluZyBzcGFjZSwgdGhlbiBzdWJ0cmFjdCBpdHMgd2lkdGguCisgICAgSGFzaFNldDxjb25z
dCBGb250Kj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCB3b3JkVHJhaWxpbmdTcGFjZVdpZHRo
ID0gKGZvbnQudHlwZXNldHRpbmdGZWF0dXJlcygpICYgS2VybmluZykgJiYgIXRleHRMYXlvdXQg
PyBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZyZW5kZXJUZXh0LCBm
b250LCAmc3BhY2UsIDEsIHN0eWxlKSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAw
OworCisgICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJl
YWtJdGVyYXRvci5sYXN0Q2hhcmFjdGVyKCk7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFj
dGVyID0gbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENo
YXJhY3RlcigpOworICAgIGZvciAoOyBtX2N1cnJlbnQub2Zmc2V0KCkgPCByZW5kZXJUZXh0LnRl
eHRMZW5ndGgoKTsgbV9jdXJyZW50LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKKyAgICAg
ICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlOworICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENoYXJh
Y3RlcklzV1M7CisgICAgICAgIFVDaGFyIGMgPSBtX2N1cnJlbnQuY3VycmVudCgpOworICAgICAg
ICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8ICgh
bV9wcmVzZXJ2ZXNOZXdsaW5lICYmIChjID09ICdcbicpKTsKKworICAgICAgICBpZiAoIW1fY29s
bGFwc2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICAg
ICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKworICAg
ICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYm
IHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgeworICAgICAgICAgICAgaHlwaGVuV2lk
dGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyVGV4dCwgZm9udCwgJmZhbGxiYWNrRm9udHMp
OworICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGh5cGhlbldpZHRoKTsK
KyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYXBwbHlXb3JkU3BhY2luZyA9IGZhbHNlOworCisg
ICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
IHx8IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOworCisgICAgICAgIGlmICgoYnJl
YWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAoIW1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQKSkgeworICAgICAg
ICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOworICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJlYWtJ
c0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1cnJlbnQub2Zmc2V0
KCkgKyAxIDwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RSQUlMKHJlbmRlclRl
eHRbbV9jdXJyZW50Lm9mZnNldCgpICsgMV0pOworICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4
dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVudC5vZmZzZXQoKSwgbWlkV29yZEJyZWFrSXNCZWZv
cmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGZvbnQsIG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAr
IHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRz
LCB0ZXh0TGF5b3V0KTsKKyAgICAgICAgICAgIG1pZFdvcmRCcmVhayA9IG1fd2lkdGguY29tbWl0
dGVkV2lkdGgoKSArIHdyYXBXICsgY2hhcldpZHRoID4gbV93aWR0aC5hdmFpbGFibGVXaWR0aCgp
OworICAgICAgICB9CisKKyAgICAgICAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbiA9IG1fY3Vy
cmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKTsKKyAgICAgICAgYm9vbCBiZXR3ZWVuV29yZHMg
PSBjID09ICdcbicgfHwgKG1fY3VycldTICE9IFBSRSAmJiAhbV9hdFN0YXJ0ICYmIGlzQnJlYWth
YmxlKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvciwgbV9jdXJyZW50Lm9mZnNl
dCgpLCBuZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCwgaXNMb29zZUNKS01vZGUpCisg
ICAgICAgICAgICAmJiAoc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lIHx8IChtX2N1cnJl
bnQucHJldmlvdXNJblNhbWVOb2RlKCkgIT0gc29mdEh5cGhlbikpKTsKKyAgICAgICAgbV9jdXJy
ZW50LnNldE5leHRCcmVha2FibGVQb3NpdGlvbihuZXh0QnJlYWthYmxlUG9zaXRpb24pOworCisg
ICAgICAgIGlmIChiZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICBi
b29sIHN0b3BwZWRJZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1faWdu
b3JpbmdTcGFjZXMpIHsKKyAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7
CisgICAgICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlz
CisgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KKyAgICAgICAgICAgICAgICAgICAg
bV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2lu
Z0ZvcldvcmRNZWFzdXJlbWVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9
IG1fY3VycmVudC5vZmZzZXQoKTsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4g
YW55IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KKyAgICAgICAgICAgICAgICAgICAgbV9saW5lTWlk
cG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50
LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBz
dG9wcGVkSWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qga2VlcCBpZ25vcmluZyB0aGVzZSBzcGFjZXMuCisg
ICAgICAgICAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25k
VG9MYXN0Q2hhcmFjdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnRz
Lmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIFdvcmRNZWFz
dXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7CisKKyAg
ICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OworICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5vZmZzZXQoKTsKKyAg
ICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKKworICAg
ICAgICAgICAgZmxvYXQgYWRkaXRpb25hbFRlbXBXaWR0aDsKKyAgICAgICAgICAgIGlmICh3b3Jk
VHJhaWxpbmdTcGFjZVdpZHRoICYmIGMgPT0gJyAnKQorICAgICAgICAgICAgICAgIGFkZGl0aW9u
YWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQu
b2Zmc2V0KCkgKyAxIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBp
c0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJh
Y2tGb250cywgdGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgo
cmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCkgLSBsYXN0U3BhY2UsIGZv
bnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKworICAg
ICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAh
ZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50
LmZhbGxiYWNrRm9udHMuc3dhcChmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgICAgIGZhbGxiYWNr
Rm9udHMuY2xlYXIoKTsKKworICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRk
aXRpb25hbFRlbXBXaWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OworICAgICAg
ICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAg
ICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsK
KworICAgICAgICAgICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFj
dGVySXNTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1w
V2lkdGgpCisgICAgICAgICAgICAgICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0
aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKKworICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFy
dFdpZHRoKSB7CisgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlu
bGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKyAg
ICAgICAgICAgICAgICBtX2FwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgYXBwbHlXb3JkU3BhY2luZyA9IHdvcmRTcGFjaW5nICYmIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2U7CisKKyAgICAgICAgICAgIGlmICghbV93aWR0aC5jb21taXR0ZWRX
aWR0aCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fd2lkdGguZml0c09uTGluZSgpKQorICAgICAgICAg
ICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsK
KworICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgfHwgYnJlYWtXb3JkcykgeworICAgICAgICAg
ICAgICAgIC8vIElmIHdlIGJyZWFrIG9ubHkgYWZ0ZXIgd2hpdGUtc3BhY2UsIGNvbnNpZGVyIHRo
ZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0
aCBmb3IgdGhpcyBsaW5lLgorICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBm
YWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkgJiYgbV9jdXJy
ZW50Q2hhcmFjdGVySXNXUyAmJiBtX2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNw
YWNlKCkgJiYgIW1pZFdvcmRCcmVhaykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFy
V2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJyZW50Lm9mZnNldCgpLCAxLCBmb250
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNw
YWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCkgKyAoYXBwbHlX
b3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIENo
ZWNrIGlmIGxpbmUgaXMgdG9vIGJpZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNwYWNlCisgICAg
ICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwg
ZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgbmVlZHMgdGhl
IGV4dHJhIHdoaXRlc3BhY2UgdG8gYmUgdG9vIGxvbmcsCisgICAgICAgICAgICAgICAgICAgIC8v
IHRoZW4gbW92ZSB0aGUgbGluZSBicmVhayB0byB0aGUgc3BhY2UgYW5kIHNraXAgYWxsCisgICAg
ICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgd2hpdGVzcGFjZS4KKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmVJbmNsdWRpbmdFeHRyYVdpZHRoKGNoYXJXaWR0
aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXYXNUb29XaWRlID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJ
dGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlN
ZS5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJy
ZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtX2xpbmVCcmVha2VyLnNraXBUcmFpbGluZ1doaXRlc3BhY2UobW9kaWZ5TWUsIG1fbGluZUlu
Zm8pOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmVXYXNUb29XaWRlIHx8
ICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSHlw
aGVuYXRlICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQs
IGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9j
a1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVm
b3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVu
dC5vZmZzZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgs
IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVT
cGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFr
YWJsZVBvc2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFr
ZXIubV9oeXBoZW5hdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIGlmIChtX2xpbmVCcmVha0hpc3RvcnkuYXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYm
IG1fY3VycmVudC5vZmZzZXQoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5z
dXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVu
ZE9mZnNldCA9IG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgp
ICYmIGRvd25jYXN0PFJlbmRlclRleHQ+KG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKSAm
JiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkpLnRl
eHRMZW5ndGgoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9saW5lQnJlYWtIaXN0b3J5LnJl
bmRlcmVyKCkpLmNoYXJhY3RlckF0KG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAtIDEpID09
IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKQorICAgICAgICAg
ICAgICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlm
IChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkgJiYgbV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNl
dCgpICE9ICh1bnNpZ25lZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3Vy
ZW1lbnQud2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0g
bV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGNoYXJXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBEaWRu
J3QgZml0LiBKdW1wIHRvIHRoZSBlbmQgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgYW4gb3Bwb3J0dW5p
dHkgdG8gY29sbGFwc2Ugd2hpdGVzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faWdu
b3JpbmdTcGFjZXMgfHwgIW1fY29sbGFwc2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0
ZXJJc1NwYWNlIHx8ICFwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXR3ZWVuV29yZHMgfHwgKG1pZFdvcmRCcmVhayAm
JiAhbV9hdXRvV3JhcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoLWFkZGl0aW9uYWxUZW1wV2lkdGgpOworICAgICAgICAgICAgICAgICAgICBp
ZiAoaHlwaGVuV2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRo
ZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBoZW4gb3V0IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCisg
ICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWh5cGhl
bldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh5cGhlbldpZHRoID0gMDsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBtX3ByZXNlcnZlc05ld2xpbmUpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkp
CisgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1p
ZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFr
QXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCks
IG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIG1fbGluZUluZm8u
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBi
ZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRX
aWR0aCgqbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50
Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICB3cmFwVyA9IDA7Cisg
ICAgICAgICAgICAgICAgLy8gQXV0by13cmFwcGluZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0
aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNlIGl0IGhhcyBoYWQgYW4KKyAgICAgICAgICAgICAgICAv
LyBvcHBvcnR1bml0eSB0byBicmVhayBhZnRlciBhIHdvcmQuCisgICAgICAgICAgICAgICAgYnJl
YWtXb3JkcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWlkV29y
ZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19N
X01BU0spKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJs
ZSBwb3NpdGlvbiBpbiBjYXNlCisgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lk
dGggZm9yY2VzIGEgYnJlYWsuCisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1v
dmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQu
bmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIG1pZFdvcmRCcmVhayAm
PSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmIChiZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2lu
ZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICAgICAg
d29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiB3b3Jk
TWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgICAgIGxh
c3RTcGFjZSA9IG1fY3VycmVudC5vZmZzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdoaXRl
U3BhY2UoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhIG5ld2xpbmUs
IG9yIGlmIHdlIGVuY291bnRlciBhCisgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHNwYWNlLCB3
ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCisgICAgICAgICAgICAgICAgLy8g
cnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMuCisg
ICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlvdXND
aGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMg
PSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1vZGUg
d2hlcmUgd2UgYXJlIGlnbm9yaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlcy4gQ3Jl
YXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KKyAgICAgICAgICAgICAgICAgICAg
Ly8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIG1fbGluZU1p
ZHBvaW50U3RhdGUuc3RhcnRJZ25vcmluZ1NwYWNlcyhtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsK
KyAgICAgICAgICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9y
VHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigpLCBUcmFp
bGluZ09iamVjdHM6OkRvTm90Q29sbGFwc2VGaXJzdFNwYWNlKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcykgewor
ICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKKyAg
ICAgICAgICAgIC8vIG5ldyBwb2ludC4KKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBm
YWxzZTsKKyAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2lu
ZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1
cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYgd29yZE1lYXN1cmVtZW50cy5sYXN0KCkud2lk
dGgpID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50
Lm9mZnNldCgpOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhl
IGlnbm9yZWQgc3BhY2VzLgorICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdu
b3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3Vy
cmVudC5vZmZzZXQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU1ZHVGV4dCAmJiBt
X2N1cnJlbnQub2Zmc2V0KCkpIHsKKyAgICAgICAgICAgIC8vIEZvcmNlIGNyZWF0aW9uIG9mIG5l
dyBJbmxpbmVCb3hlcyBmb3IgZWFjaCBhYnNvbHV0ZSBwb3NpdGlvbmVkIGNoYXJhY3RlciAodGhv
c2UgdGhhdCBzdGFydCBuZXcgdGV4dCBjaHVua3MpLgorICAgICAgICAgICAgaWYgKGRvd25jYXN0
PFJlbmRlclNWR0lubGluZVRleHQ+KHJlbmRlclRleHQpLmNoYXJhY3RlclN0YXJ0c05ld1RleHRD
aHVuayhtX2N1cnJlbnQub2Zmc2V0KCkpKQorICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3Rl
ckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlvdXNDaGFy
YWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldFJl
bmRlcmVyKG1fY3VycmVudC5yZW5kZXJlcigpKTsKKyAgICAgICAgICAgIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXMuc2V0T2Zmc2V0KG1fY3VycmVudC5vZmZzZXQoKSk7CisgICAgICAgICAgICAvLyBT
cGFjZXMgYWZ0ZXIgcmlnaHQtYWxpZ25lZCB0ZXh0IGFuZCBiZWZvcmUgYSBsaW5lLWJyZWFrIGdl
dCBjb2xsYXBzZWQgYXdheSBjb21wbGV0ZWx5IHNvIHRoYXQgdGhlIHRyYWlsaW5nCisgICAgICAg
ICAgICAvLyBzcGFjZSBkb2Vzbid0IHNlZW0gdG8gcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUg
cmlnaHQtaGFuZCBlZGdlLgorICAgICAgICAgICAgLy8gRklYTUU6IERvIHRoaXMgcmVnYXJkbGVz
cyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2lsbCByZXF1aXJlIHJlYmFzZWxpbmlu
ZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCisgICAgICAgICAgICBpZiAobV9uZXh0T2JqZWN0ICYm
IG1fc3RhcnRPZklnbm9yZWRTcGFjZXMub2Zmc2V0KCkgJiYgbV9uZXh0T2JqZWN0LT5pc0JSKCkg
JiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8fCBtX2Jsb2NrU3R5bGUudGV4
dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkgeworICAgICAgICAgICAgICAgIG1fc3RhcnRPZkln
bm9yZWRTcGFjZXMuc2V0T2Zmc2V0KG1fc3RhcnRPZklnbm9yZWRTcGFjZXMub2Zmc2V0KCkgLSAx
KTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGp1c3QgYSBzaW5nbGUgdHJhaWxpbmcg
c3BhY2Ugc3RhcnQgaWdub3JpbmcgaXQgbm93IHNvIGl0IGNvbGxhcHNlcyBhd2F5LgorICAgICAg
ICAgICAgICAgIGlmIChtX2N1cnJlbnQub2Zmc2V0KCkgPT0gcmVuZGVyVGV4dC50ZXh0TGVuZ3Ro
KCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdu
b3JpbmdTcGFjZXMobV9zdGFydE9mSWdub3JlZFNwYWNlcyk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzV1MgJiYgcHJldmlvdXND
aGFyYWN0ZXJJc1dTKSB7CisgICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRT
dHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkpCisgICAgICAgICAgICAgICAgbV9saW5l
QnJlYWtIaXN0b3J5Lm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNl
dCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgJiYgIW1faWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5z
ZXRUcmFpbGluZ1doaXRlc3BhY2UoZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9jdXJyZW50LnJlbmRl
cmVyKCkpKTsKKyAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdoaXRl
U3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgICAgIG1fdHJh
aWxpbmdPYmplY3RzLmNsZWFyKCk7CisKKyAgICAgICAgbV9hdFN0YXJ0ID0gZmFsc2U7CisgICAg
ICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVy
KTsKKyAgICB9CisKKyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc2V0
UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7CisKKyAg
ICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsKKyAg
ICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFz
dCgpOworICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OworCisgICAg
Ly8gSU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCisgICAgZmxvYXQg
YWRkaXRpb25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHJl
bmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpIC0gbGFzdFNwYWNlLCBmb250
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNw
YWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisgICAgd29y
ZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOworICAgIHdvcmRNZWFzdXJlbWVu
dC5lbmRPZmZzZXQgPSBtX2N1cnJlbnQub2Zmc2V0KCk7CisgICAgd29yZE1lYXN1cmVtZW50Lndp
ZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiBhZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNw
YWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQ7CisgICAgYWRkaXRpb25hbFRlbXBXaWR0aCArPSBsYXN0
U3BhY2VXb3JkU3BhY2luZzsKKworICAgIGZsb2F0IGlubGluZUxvZ2ljYWxUZW1wV2lkdGggPSBp
bmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJlbmRlcmVyKCksICFtX2FwcGxpZWRTdGFydFdp
ZHRoLCBtX2luY2x1ZGVFbmRXaWR0aCk7CisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGFkZGl0aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKKworICAgIGlm
ICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9u
dHMuaXNFbXB0eSgpKQorICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2Fw
KGZhbGxiYWNrRm9udHMpOworICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKworICAgIGlmICht
X2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0
aW9uYWxUZW1wV2lkdGgpCisgICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lk
dGgoYWRkaXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7CisKKyAgICBt
X2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOworCisgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUo
KSkgeworICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKSB7CisgICAgICAgICAgICBtX2xpbmVCcmVh
a0hpc3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAg
ICAgICAgdHJ5SHlwaGVuYXRpbmcocmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNv
bnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExp
bmVzKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25M
aW1pdEFmdGVyKCksIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJl
bnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgp
LCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2lu
ZywgbW9kaWZ5TWUsIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJl
YWtlci5tX2h5cGhlbmF0ZWQpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoIWh5cGhlbmF0ZWQgJiYgbV9saW5lQnJlYWtIaXN0b3J5LnByZXZpb3VzSW5TYW1lTm9k
ZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKSB7Cisg
ICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVl
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wg
dGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihSZW5kZXJUZXh0JiBuZXh0VGV4dCkKK3sK
KyAgICBVQ2hhciBjID0gbmV4dFRleHQuY2hhcmFjdGVyQXQoMCk7CisgICAgcmV0dXJuIGMgPT0g
JyAnIHx8IGMgPT0gJ1x0JyB8fCAoYyA9PSAnXG4nICYmICFuZXh0VGV4dC5wcmVzZXJ2ZXNOZXds
aW5lKCkpOworfQorCitpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlz
UG9zaXRpb24oKQoreworICAgIC8vIElmIHdlIGFyZSBuby13cmFwIGFuZCBoYXZlIGZvdW5kIGEg
bGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5IHRoZW4gd2Ugc2hvdWxkIHRha2UgaXQu
CisgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiAhbV93aWR0aC5maXRzT25MaW5l
KG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1fY3VycldTID09IE5PV1JBUCkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBBdm9pZCBicmVha2luZyBvbiBlbXB0eSBpbmxpbmVz
LgorICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgaXNF
bXB0eUlubGluZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBBdm9pZCBicmVha2luZyBiZWZvcmUg
ZW1wdHkgaW5saW5lcyAoYXMgbG9uZyBhcyB0aGUgY3VycmVudCBvYmplY3QgaXNuJ3QgcmVwbGFj
ZWQpLgorICAgIGlmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUmVwbGFjZWQoKSAmJiBpczxS
ZW5kZXJJbmxpbmU+KG1fbmV4dE9iamVjdCkgJiYgaXNFbXB0eUlubGluZShkb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KCptX25leHRPYmplY3QpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gUmV0dXJuIGVhcmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIg
aXMgYSBzcGFjZSBhcyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3Np
dGlvbi4KKyAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2Jq
ZWN0LT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFw
OworCisgICAgYm9vbCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gaXM8UmVuZGVyVGV4dD4obV9u
ZXh0T2JqZWN0KSAmJiAobV9hdXRvV3JhcCB8fCBtX25leHRPYmplY3QtPnN0eWxlKCkuYXV0b1dy
YXAoKSk7CisgICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQorICAgICAgICByZXR1cm4g
bV9hdXRvV3JhcDsKKyAgICBSZW5kZXJUZXh0JiBuZXh0UmVuZGVyVGV4dCA9IGRvd25jYXN0PFJl
bmRlclRleHQ+KCptX25leHRPYmplY3QpOworICAgIGJvb2wgY3VycmVudElzVGV4dE9yRW1wdHlJ
bmxpbmUgPSBpczxSZW5kZXJUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpIHx8IChpczxSZW5k
ZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgaXNFbXB0eUlubGluZShkb3duY2Fz
dDxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpKTsKKyAgICBpZiAoIWN1cnJl
bnRJc1RleHRPckVtcHR5SW5saW5lKQorICAgICAgICByZXR1cm4gbV9hdXRvV3JhcCAmJiAhbV9j
dXJyZW50LnJlbmRlcmVyKCktPmlzUnVieVJ1bigpOworCisgICAgYm9vbCBjYW5CcmVha0hlcmUg
PSAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiB0ZXh0QmVnaW5zV2l0aEJyZWFrYWJsZVBv
c2l0aW9uKG5leHRSZW5kZXJUZXh0KTsKKworICAgIC8vIFNlZSBpZiBhdHRlbXB0aW5nIHRvIGZp
dCBiZWxvdyBmbG9hdHMgY3JlYXRlcyBtb3JlIGF2YWlsYWJsZSB3aWR0aCBvbiB0aGUgbGluZS4K
KyAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRo
KCkpCisgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGlu
ZSgpKTsKKworICAgIGJvb2wgY2FuUGxhY2VPbkxpbmUgPSBtX3dpZHRoLmZpdHNPbkxpbmUoKSB8
fCAhbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lOworCisgICAgaWYgKGNhblBsYWNlT25MaW5l
ICYmIGNhbkJyZWFrSGVyZSkKKyAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgo
bmV4dFJlbmRlclRleHQpOworCisgICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKK30KKworaW5saW5l
IHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgp
Cit7CisgICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpOwor
CisgICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9yaW5n
U3BhY2VzKSkgeworICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRvIGdldCBiZWxv
dyB0aGVtLgorICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9pZ25v
cmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCisgICAg
ICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIGlmIChtX3dpZHRo
LmNvbW1pdHRlZFdpZHRoKCkpIHsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0
cyhtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOworCisgICAgICAgIC8vIHx3aWR0aHwgbWF5IGhh
dmUgYmVlbiBhZGp1c3RlZCBiZWNhdXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQg
KHRodXMKKyAgICAgICAgLy8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0
ZXN0LCBhbmQgb25seSBqdW1wIHRvCisgICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3Rp
bGwgZG9uJ3QgZml0IG9uIHRoZSBsaW5lLiAtZHdoCisgICAgICAgIGlmICghbV93aWR0aC5maXRz
T25MaW5lKG1faWdub3JpbmdTcGFjZXMpKSB7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0
eWxlLmF1dG9XcmFwKCkgJiYgIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1p
dHRlZFdpZHRoKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0
IHRoZSBjdXJyZW50IGNoaWxkIGRvZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUg
dGhhdCBpdAorICAgICAgICAvLyB3cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KKyAg
ICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOwor
ICAgIH0KKworICAgIGlmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzRmxvYXRpbmdPck91dE9m
Rmxvd1Bvc2l0aW9uZWQoKSkgeworICAgICAgICBtX2xhc3RPYmplY3QgPSBtX2N1cnJlbnQucmVu
ZGVyZXIoKTsKKyAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpICYmIG1fYXV0
b1dyYXAgJiYgIW1fbGFzdE9iamVjdC0+aXNSdWJ5UnVuKCkgJiYgKCFtX2xhc3RPYmplY3QtPmlz
SW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFpczxSZW5kZXJMaXN0TWFya2Vy
PigqbV9sYXN0T2JqZWN0KSB8fCBkb3duY2FzdDxSZW5kZXJMaXN0TWFya2VyPigqbV9sYXN0T2Jq
ZWN0KS5pc0luc2lkZSgpKSkKKyAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdp
ZHRoKCptX25leHRPYmplY3QpOworICAgIH0KK30KKworaW5saW5lIFRyYWlsaW5nT2JqZWN0czo6
Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBvaW50U3RhdGUm
IGxpbmVNaWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrKQoreworICAg
IC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0IHBvaW50IGJl
eW9uZCB0aGUgbGluZSBicmVhay4gSWYgc28sCisgICAgLy8gc2hhdmUgaXQgb2ZmIHRoZSBsaXN0
LCBhbmQgc2hhdmUgb2ZmIGEgdHJhaWxpbmcgc3BhY2UgaWYgdGhlIHByZXZpb3VzIGVuZCBwb2lu
dCBkb2Vzbid0CisgICAgLy8gcHJlc2VydmUgd2hpdGVzcGFjZS4KKyAgICBpZiAobEJyZWFrLnJl
bmRlcmVyKCkgJiYgbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgJiYgIShsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMoKSAlIDIpKSB7CisgICAgICAgIElubGluZUl0ZXJhdG9y
KiBtaWRwb2ludHMgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMoKS5kYXRhKCk7CisgICAg
ICAgIElubGluZUl0ZXJhdG9yJiBlbmRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMoKSAtIDJdOworICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3Rh
cnRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMoKSAtIDFd
OworICAgICAgICBJbmxpbmVJdGVyYXRvciBjdXJycG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAg
d2hpbGUgKCFjdXJycG9pbnQuYXRFbmQoKSAmJiBjdXJycG9pbnQgIT0gc3RhcnRwb2ludCAmJiBj
dXJycG9pbnQgIT0gbEJyZWFrKQorICAgICAgICAgICAgY3VycnBvaW50LmluY3JlbWVudCgpOwor
ICAgICAgICBpZiAoY3VycnBvaW50ID09IGxCcmVhaykgeworICAgICAgICAgICAgLy8gV2UgaGl0
IHRoZSBsaW5lIGJyZWFrIGJlZm9yZSB0aGUgc3RhcnQgcG9pbnQuIFNoYXZlIG9mZiB0aGUgc3Rh
cnQgcG9pbnQuCisgICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5kZWNyZWFzZU51bU1pZHBv
aW50cygpOworICAgICAgICAgICAgaWYgKGVuZHBvaW50LnJlbmRlcmVyKCktPnN0eWxlKCkuY29s
bGFwc2VXaGl0ZVNwYWNlKCkgJiYgZW5kcG9pbnQucmVuZGVyZXIoKS0+aXNUZXh0KCkpIHsKKyAg
ICAgICAgICAgICAgICBlbmRwb2ludC5mYXN0RGVjcmVtZW50KCk7CisgICAgICAgICAgICAgICAg
cmV0dXJuIFRyYWlsaW5nT2JqZWN0czo6RG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2U7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRyYWlsaW5nT2JqZWN0czo6Q29s
bGFwc2VGaXJzdFNwYWNlOworfQorCitpbmxpbmUgSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250
ZXh0OjpoYW5kbGVFbmRPZkxpbmUoKQoreworICAgIGlmIChtX2xpbmVCcmVha0hpc3RvcnkuY3Vy
cmVudCgpID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkgeworICAgICAgICBpZiAoIW1fbGluZUJy
ZWFrSGlzdG9yeS5yZW5kZXJlcigpIHx8ICFtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKS0+
aXNCUigpKSB7CisgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxl
CisgICAgICAgICAgICBpZiAobV9ibG9ja1N0eWxlLndoaXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1f
Y3VycmVudC5vZmZzZXQoKSkKKyAgICAgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJl
bnRXaWR0aCgqbV9sYXN0T2JqZWN0LCBtX2xhc3RPYmplY3QtPmlzVGV4dCgpID8gbV9sYXN0T2Jq
ZWN0LT5sZW5ndGgoKSA6IDApOworICAgICAgICAgICAgZWxzZSBpZiAobV9saW5lQnJlYWtIaXN0
b3J5LnJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBldmVyIGJyZWFrIGlu
IHRoZSBtaWRkbGUgb2YgYSB3b3JkIGlmIHdlIGNhbiBoZWxwIGl0LgorICAgICAgICAgICAgICAg
IC8vIFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxp
bmUsCisgICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggd2UnbGwgc3BpbGwgb3V0LgorICAg
ICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJlbnQucmVu
ZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3Qu
CisgICAgICAgIGlmIChtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpID09IG1fcmVzb2x2ZXIu
cG9zaXRpb24oKSkKKyAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsK
KyAgICB9IGVsc2UgaWYgKCFtX2N1cnJlbnQub2Zmc2V0KCkgJiYgIW1fd2lkdGguY29tbWl0dGVk
V2lkdGgoKSAmJiBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRl
ZFdpZHRoQmVmb3JlQ3VycmVudCkgeworICAgICAgICAvLyBEbyBub3QgcHVzaCB0aGUgY3VycmVu
dCBvYmplY3QgdG8gdGhlIG5leHQgbGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNvbWUgY29udGVu
dCwgYnV0IGl0IGlzIHN0aWxsIGNvbnNpZGVyZWQgZW1wdHkuCisgICAgICAgIC8vIEVtcHR5IGlu
bGluZSBlbGVtZW50cyBsaWtlIDxzcGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBh
bmQgbm93IHdlIGp1c3QgaWdub3JlIHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKKyAgICAgICAg
Ly8gYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVk
IHlldC4KKyAgICAgICAgLy8gQmVoYXZlIGFzIGlmIGl0IHdhcyBhY3R1YWxseSBlbXB0eSBhbmQg
Y29uc3VtZSBhdCBsZWFzdCBvbmUgb2JqZWN0LgorICAgICAgICBtX2xpbmVCcmVha0hpc3Rvcnku
aW5jcmVtZW50KCk7CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrIG91ciBtaWRwb2ludHMu
CisgICAgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjb2xsYXBzZWQg
PSBjaGVja01pZHBvaW50cyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVha0hpc3Rvcnku
Y3VycmVudCgpKTsKKworICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRy
YWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJl
bnQoKSwgY29sbGFwc2VkKTsKKworICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsg
YW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgcGFzdCB0aGUgZW5kCisgICAgLy8gb2YgdGhlIG9iamVj
dC4gRG8gdGhpcyBhZGp1c3RtZW50IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0CisgICAg
Ly8gb2YgdGhlIG5leHQgb2JqZWN0IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0
IG9mIHRoZQorICAgIC8vIGNvZGUuCisgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQo
KSkgeworICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkudXBkYXRlKFtdKElubGluZUl0ZXJhdG9y
JiBtb2RpZnlNZSkgeworICAgICAgICAgICAgbW9kaWZ5TWUuc2V0T2Zmc2V0KG1vZGlmeU1lLm9m
ZnNldCgpIC0gMSk7CisgICAgICAgICAgICBtb2RpZnlNZS5pbmNyZW1lbnQoKTsKKyAgICAgICAg
fSk7CisgICAgfQorCisjaWYgRU5BQkxFKENTU19UUkFJTElOR19XT1JEKQorICAgIGlmIChtX2Js
b2NrU3R5bGUudHJhaWxpbmdXb3JkKCkgPT0gVHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNl
ZCkgeworICAgICAgICBJbmxpbmVJdGVyYXRvciBsaW5lQnJlYWsgPSBtX2xpbmVCcmVha0hpc3Rv
cnkuY3VycmVudCgpOworICAgICAgICBpZiAobGluZUJyZWFrLnJlbmRlcmVyKCkgJiYgbV9saW5l
SW5mby5pc0ZpcnN0TGluZSgpICYmICFiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKCpsaW5l
QnJlYWsucm9vdCgpLCBsaW5lQnJlYWsucmVuZGVyZXIoKSkgJiYgaXM8UmVuZGVyVGV4dD4obGlu
ZUJyZWFrLnJlbmRlcmVyKCkpKSB7CisgICAgICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0
ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKmxpbmVCcmVhay5yZW5kZXJlcigpKTsKKyAgICAgICAg
ICAgIC8vIERvbid0IGV2ZW4gYm90aGVyIG1lYXN1cmluZyBpZiBvdXIgcmVtYWluaW5nIGxpbmUg
aGFzIG1hbnkgY2hhcmFjdGVycworICAgICAgICAgICAgaWYgKHJlbmRlclRleHQudGV4dExlbmd0
aCgpID09IGxpbmVCcmVhay5vZmZzZXQoKSB8fCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAtIGxp
bmVCcmVhay5vZmZzZXQoKSA+IDIwKQorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQnJlYWs7
CisgICAgICAgICAgICBib29sIGlzTG9vc2VDSktNb2RlID0gbV9yZW5kZXJUZXh0SW5mby5tX3Rl
eHQgIT0gJnJlbmRlclRleHQgJiYgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9y
LmlzTG9vc2VDSktNb2RlKCk7CisgICAgICAgICAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dy
YXAgJiYgbV9jdXJyZW50U3R5bGUtPm5ic3BNb2RlKCkgPT0gU1BBQ0U7CisgICAgICAgICAgICBp
bnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gbGluZUJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlv
bigpOworICAgICAgICAgICAgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVh
a0l0ZXJhdG9yLCBsaW5lQnJlYWsub2Zmc2V0KCkgKyAxLCBuZXh0QnJlYWthYmxlUG9zaXRpb24s
IGJyZWFrTkJTUCwgaXNMb29zZUNKS01vZGUpOworICAgICAgICAgICAgaWYgKG5leHRCcmVha2Fi
bGVQb3NpdGlvbiA8IDAgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG5leHRCcmVha2FibGVQb3Np
dGlvbikgIT0gcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGxpbmVCcmVhazsKKyAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVT
dHlsZShyZW5kZXJUZXh0LCBtX2xpbmVJbmZvKTsKKyAgICAgICAgICAgIGNvbnN0IEZvbnRDYXNj
YWRlJiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKKyAgICAgICAgICAgIEhhc2hTZXQ8Y29u
c3QgRm9udCo+IGR1bW15Rm9udHM7CisgICAgICAgICAgICBJbmxpbmVJdGVyYXRvciBiZXN0ID0g
bGluZUJyZWFrOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtX2xpbmVCcmVh
a0hpc3RvcnkuaGlzdG9yeUxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgY2FuZGlkYXRlID0gbV9saW5lQnJlYWtIaXN0b3J5LmdldChpKTsKKyAg
ICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLnJlbmRlcmVyKCkgIT0gbGluZUJyZWFrLnJlbmRl
cmVyKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICAgICAgICAg
IGZsb2F0IHdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGNhbmRpZGF0ZS5vZmZzZXQoKSwg
cmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgLSBjYW5kaWRhdGUub2Zmc2V0KCksIGZvbnQsIDAsIGZv
bnQuaXNGaXhlZFBpdGNoKCksIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCBkdW1teUZvbnRzKTsKKyAg
ICAgICAgICAgICAgICBpZiAod2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCkpCisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICAgICAgICAgIGlmICh3aWR0aCAv
IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSA+IDAuMSkgLy8gU3Vic2VxdWVudCBsaW5lIGlzIGxv
bmcgZW5vdWdoCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7CisgICAgICAg
ICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJl
dHVybiBiZXN0OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIG1fbGluZUJy
ZWFrSGlzdG9yeS5jdXJyZW50KCk7Cit9CisKK30KKworI2VuZGlmIC8vIEJyZWFraW5nQ29udGV4
dF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0Nv
bnRleHRJbmxpbmVIZWFkZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVh
a2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDdkOTBlY2VmNzAzNWYyZDk3ZTE1ZDQ2NDBjZDIwODE1N2UxNGZkMTAuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEs
MTA4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xs
QGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHly
aWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgotICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCi0g
KgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwot
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwot
Ci0jaWZuZGVmIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAotI2RlZmluZSBCcmVha2lu
Z0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKLQotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCi0jaW5j
bHVkZSAiTGluZUJyZWFrZXIuaCIKLSNpbmNsdWRlICJMaW5lSW5mby5oIgotI2luY2x1ZGUgIkxp
bmVXaWR0aC5oIgotI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCi0jaW5jbHVkZSAiUmVu
ZGVyQ291bnRlci5oIgotI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgotI2luY2x1ZGUgIlJlbmRl
ckxpbmVCcmVhay5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKLSNpbmNsdWRlICJS
ZW5kZXJSdWJ5UnVuLmgiCi0jaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgotI2luY2x1
ZGUgIlRyYWlsaW5nT2JqZWN0cy5oIgotI2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCi0jaW5jbHVk
ZSA8d3RmL3RleHQvU3RyaW5nVmlldy5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rl
ck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotLy8gV2UgZG9uJ3QgbGV0IG91ciBs
aW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4gdGhpcy4K
LWNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7Ci0KLXN0cnVjdCBXb3JkTWVhc3Vy
ZW1lbnQgewotICAgIFdvcmRNZWFzdXJlbWVudCgpCi0gICAgICAgIDogcmVuZGVyZXIoMCkKLSAg
ICAgICAgLCB3aWR0aCgwKQotICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCi0gICAgICAgICwgZW5k
T2Zmc2V0KDApCi0gICAgewotICAgIH0KLQotICAgIFJlbmRlclRleHQqIHJlbmRlcmVyOwotICAg
IGZsb2F0IHdpZHRoOwotICAgIGludCBzdGFydE9mZnNldDsKLSAgICBpbnQgZW5kT2Zmc2V0Owot
ICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7Ci19OwotCi1jbGFzcyBCcmVh
a2luZ0NvbnRleHQgewotcHVibGljOgotICAgIEJyZWFraW5nQ29udGV4dChMaW5lQnJlYWtlciYg
bGluZUJyZWFrZXIsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBpbkxp
bmVJbmZvLCBMaW5lV2lkdGgmIGxpbmVXaWR0aCwgUmVuZGVyVGV4dEluZm8mIGluUmVuZGVyVGV4
dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBpbkxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGJvb2wg
YXBwbGllZFN0YXJ0V2lkdGgsIFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCi0gICAgICAgIDogbV9s
aW5lQnJlYWtlcihsaW5lQnJlYWtlcikKLSAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29sdmVyKQot
ICAgICAgICAsIG1fY3VycmVudChyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAgICAsIG1fbGlu
ZUJyZWFrKHJlc29sdmVyLnBvc2l0aW9uKCkpCi0gICAgICAgICwgbV9ibG9jayhibG9jaykKLSAg
ICAgICAgLCBtX2xhc3RPYmplY3QobV9jdXJyZW50LnJlbmRlcmVyKCkpCi0gICAgICAgICwgbV9u
ZXh0T2JqZWN0KG51bGxwdHIpCi0gICAgICAgICwgbV9jdXJyZW50U3R5bGUobnVsbHB0cikKLSAg
ICAgICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKLSAgICAgICAgLCBtX2xpbmVJbmZv
KGluTGluZUluZm8pCi0gICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhpblJlbmRlclRleHRJbmZv
KQotICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShpbkxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUpCi0gICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgpCi0gICAgICAgICwgbV9j
dXJyV1MoTk9STUFMKQotICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkKLSAgICAgICAgLCBtX3By
ZXNlcnZlc05ld2xpbmUoZmFsc2UpCi0gICAgICAgICwgbV9hdFN0YXJ0KHRydWUpCi0gICAgICAg
ICwgbV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKLSAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzV1MoZmFsc2UpCi0g
ICAgICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRXaWR0aCkKLSAgICAgICAg
LCBtX2luY2x1ZGVFbmRXaWR0aCh0cnVlKQotICAgICAgICAsIG1fYXV0b1dyYXAoZmFsc2UpCi0g
ICAgICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNlKQotICAgICAgICAsIG1f
ZmxvYXRzRml0T25MaW5lKHRydWUpCi0gICAgICAgICwgbV9jb2xsYXBzZVdoaXRlU3BhY2UoZmFs
c2UpCi0gICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xpbmVJbmZvLnByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSgpKQotICAgICAgICAsIG1fYWxsb3dJbWFnZXNUb0JyZWFrKCFibG9j
ay5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1RhYmxlQ2VsbCgpIHx8ICFt
X2Jsb2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAg
LCBtX2F0RW5kKGZhbHNlKQotICAgICAgICAsIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1
cnJlbnQoZmFsc2UpCi0gICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0ZShyZXNvbHZlci5taWRw
b2ludFN0YXRlKCkpCi0gICAgewotICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seShmYWxzZSk7Ci0gICAgfQotCi0gICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50T2Jq
ZWN0KCkgeyByZXR1cm4gbV9jdXJyZW50LnJlbmRlcmVyKCk7IH0KLSAgICBJbmxpbmVJdGVyYXRv
ciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVhazsgfQotICAgIElubGluZUl0ZXJhdG9y
JiBsaW5lQnJlYWtSZWYoKSB7cmV0dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgTGluZVdpZHRoJiBs
aW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9Ci0gICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJu
IG1fYXRFbmQ7IH0KLQotICAgIHZvaWQgaW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKTsKLQot
ICAgIHZvaWQgaW5jcmVtZW50KCk7Ci0KLSAgICB2b2lkIGhhbmRsZUJSKEVDbGVhciYpOwotICAg
IHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0
aW9uZWRPYmplY3RzKTsKLSAgICB2b2lkIGhhbmRsZUZsb2F0KCk7Ci0gICAgdm9pZCBoYW5kbGVF
bXB0eUlubGluZSgpOwotICAgIHZvaWQgaGFuZGxlUmVwbGFjZWQoKTsKLSAgICBib29sIGhhbmRs
ZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJvb2wmIGh5cGhlbmF0ZWQsIHVuc2lnbmVkJiBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgYm9vbCBjYW5CcmVha0F0VGhpc1Bvc2l0aW9u
KCk7Ci0gICAgdm9pZCBjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgpOwotICAgIElu
bGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGluZSgpOwotCi0gICAgdm9pZCBjbGVhckxpbmVCcmVh
a0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFjZSA9IGZhbHNlKQotICAgIHsK
LSAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmluZ1RyYWlsaW5nU3BhY2UpIHx8
IG1fbGFzdFdTID09IE5PV1JBUCkKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmNsZWFyKCk7Ci0g
ICAgfQotCi0gICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmpl
Y3QmIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQotICAg
IHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRv
KCZvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTGlu
ZUJyZWFrZXImIG1fbGluZUJyZWFrZXI7Ci0gICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29s
dmVyOwotCi0gICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OwotICAgIElubGluZUl0ZXJhdG9y
IG1fbGluZUJyZWFrOwotICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFjZXM7
Ci0KLSAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX2xh
c3RPYmplY3Q7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7Ci0KLSAgICBjb25zdCBS
ZW5kZXJTdHlsZSogbV9jdXJyZW50U3R5bGU7Ci0KLSAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3
aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQg
dW5kZXIKLSAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1h
dGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4KLSAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUg
cXVpcmsgaGFzIGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBC
dWd6aWxsYSAxMDUxNy4pCi0gICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKLQotICAgIExp
bmVJbmZvJiBtX2xpbmVJbmZvOwotCi0gICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dElu
Zm87Ci0KLSAgICBGbG9hdGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOwot
Ci0gICAgTGluZVdpZHRoIG1fd2lkdGg7Ci0KLSAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKLSAg
ICBFV2hpdGVTcGFjZSBtX2xhc3RXUzsKLQotICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOwot
ICAgIGJvb2wgbV9hdFN0YXJ0OwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkg
aWYgd2hpdGVzcGFjZSBpc24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgot
ICAgIC8vIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCi0gICAg
Ym9vbCBtX2lnbm9yaW5nU3BhY2VzOwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hl
dGhlciB0aGUgdmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuIFdlIHVzZQot
ICAgIC8vIHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNv
IHdlIGtub3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKLSAgICAvLyBhIHJ1bi4KLSAgICBib29sIG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2U7Ci0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dT
OwotICAgIGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKLSAgICBib29sIG1faW5jbHVkZUVuZFdp
ZHRoOwotICAgIGJvb2wgbV9hdXRvV3JhcDsKLSAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZTsKLSAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOwotICAgIGJvb2wgbV9jb2xsYXBz
ZVdoaXRlU3BhY2U7Ci0gICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOwotICAgIGJvb2wg
bV9hbGxvd0ltYWdlc1RvQnJlYWs7Ci0gICAgYm9vbCBtX2F0RW5kOwotICAgIGJvb2wgbV9oYWRV
bmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKLQotICAgIExpbmVNaWRwb2ludFN0YXRlJiBt
X2xpbmVNaWRwb2ludFN0YXRlOwotCi0gICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmpl
Y3RzOwotfTsKLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3Vy
cmVudE9iamVjdCgpCi17Ci0gICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9
ICEhbV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7Ci0KLSAgICBtX2N1cnJlbnRTdHlsZSA9ICZt
X2N1cnJlbnQucmVuZGVyZXIoKS0+c3R5bGUoKTsgLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlICZs
aW5lU3R5bGUoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2xpbmVJbmZvKTsgPwotCi0gICAgQVNT
RVJUKG1fY3VycmVudFN0eWxlKTsKLQotICAgIG1fbmV4dE9iamVjdCA9IGJpZGlOZXh0U2tpcHBp
bmdFbXB0eUlubGluZXMobV9ibG9jaywgbV9jdXJyZW50LnJlbmRlcmVyKCkpOwotICAgIGlmICht
X25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJlbnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5w
YXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50LnJlbmRlcmVyKCktPnBhcmVudCgpKSkK
LSAgICAgICAgbV9pbmNsdWRlRW5kV2lkdGggPSB0cnVlOwotCi0gICAgbV9jdXJyV1MgPSBtX2N1
cnJlbnQucmVuZGVyZXIoKS0+aXNSZXBsYWNlZCgpID8gbV9jdXJyZW50LnJlbmRlcmVyKCktPnBh
cmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53aGl0ZVNwYWNl
KCk7Ci0gICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/IG1fbGFzdE9i
amVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2JqZWN0LT5zdHls
ZSgpLndoaXRlU3BhY2UoKTsKLQotICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6YXV0b1dy
YXAobV9jdXJyV1MpOwotICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IG1fYXV0b1dy
YXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOwotCi0gICAgbV9wcmVzZXJ2ZXNOZXds
aW5lID0gbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzU1ZHSW5saW5lVGV4dCgpID8gZmFsc2UgOiBS
ZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsKLQotICAgIG1fY29sbGFwc2VX
aGl0ZVNwYWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Ci19
Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKLXsKLSAgICAvLyBD
bGVhciBvdXQgb3VyIGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRv
bid0IGNvbGxhcHNlIHdoaXRlc3BhY2UKLSAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3Jt
YWwvbm93cmFwIHNwYW5zLgotICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCi0gICAgICAg
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLQotICAgIG1fY3VycmVudC5tb3Zl
VG9TdGFydE9mKG1fbmV4dE9iamVjdCk7Ci0gICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci19Ci0KLWlu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKLXsKLSAg
ICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9
IG1fY3VycmVudC5yZW5kZXJlcigpOwotICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9m
KGJyKTsKLSAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Ci0KLSAgICAgICAgLy8gQSA8
YnI+IGFsd2F5cyBicmVha3MgYSBsaW5lLCBzbyBkb24ndCBsZXQgdGhlIGxpbmUgYmUgY29sbGFw
c2VkCi0gICAgICAgIC8vIGF3YXkuIEFsc28sIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgbGlu
ZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAotICAgICAgICAvLyBnZXQgY29sbGFwc2VkIGF3YXkuIEl0
IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBwcmV2aW91cyBsaW5lIGJyb2tlCi0gICAgICAgIC8vIGNs
ZWFubHkuIE90aGVyd2lzZSB0aGUgPGJyPiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhlIGxp
bmUgaXMKLSAgICAgICAgLy8gZW1wdHkgb3Igbm90LgotICAgICAgICBpZiAobV9zdGFydGluZ05l
d1BhcmFncmFwaCkKLSAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Js
b2NrLCAmbV93aWR0aCk7Ci0gICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0gICAg
ICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotCi0gICAg
ICAgIC8vIEEgPGJyPiB3aXRoIGNsZWFyYW5jZSBhbHdheXMgbmVlZHMgYSBsaW5lYm94IGluIGNh
c2UgdGhlIGxpbmVzIGJlbG93IGl0IGdldCBkaXJ0aWVkIGxhdGVyIGFuZAotICAgICAgICAvLyBu
ZWVkIHRvIGNoZWNrIGZvciBmbG9hdHMgdG8gY2xlYXIgLSBzbyBpZiB3ZSdyZSBpZ25vcmluZyBz
cGFjZXMsIHN0b3AgaWdub3JpbmcgdGhlbSBhbmQgYWRkIGEKLSAgICAgICAgLy8gcnVuIGZvciB0
aGlzIG9iamVjdC4KLSAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5
bGUtPmNsZWFyKCkgIT0gQ05PTkUpCi0gICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLmVu
c3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKGJyKTsKLSAgICAgICAgLy8gSWYgd2Ugd2Vy
ZSBwcmVjZWRlZCBieSBjb2xsYXBzaW5nIHNwYWNlIGFuZCBhcmUgaW4gYSByaWdodC1hbGlnbmVk
IGNvbnRhaW5lciB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgc3BhY2UgZ2V0cwotICAgICAgICAvLyBj
b2xsYXBzZWQgYXdheSBzbyB0aGF0IGl0IGRvZXNuJ3QgcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0
aGUgY29udGFpbmVyJ3MgcmlnaHQtaGFuZCBlZGdlLgotICAgICAgICAvLyBGSVhNRTogRG8gdGhp
cyByZWdhcmRsZXNzIG9mIHRoZSBjb250YWluZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUg
cmViYXNlbGluaW5nIGEgbG90IG9mIHRlc3QgcmVzdWx0cy4KLSAgICAgICAgZWxzZSBpZiAobV9p
Z25vcmluZ1NwYWNlcyAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1f
YmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKQotICAgICAgICAgICAgbV9s
aW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9j
dXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSkpOwotCi0gICAgICAgIGlmICgh
bV9saW5lSW5mby5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjbGVhciA9IG1fY3VycmVudFN0eWxl
LT5jbGVhcigpOwotICAgIH0KLSAgICBtX2F0RW5kID0gdHJ1ZTsKLX0KLQotaW5saW5lIExheW91
dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KGNvbnN0IFJlbmRlcklubGluZSYgY2hpbGQp
Ci17Ci0gICAgcmV0dXJuIGNoaWxkLm1hcmdpblN0YXJ0KCkgKyBjaGlsZC5wYWRkaW5nU3RhcnQo
KSArIGNoaWxkLmJvcmRlclN0YXJ0KCk7Ci19Ci0KLWlubGluZSBMYXlvdXRVbml0IGJvcmRlclBh
ZGRpbmdNYXJnaW5FbmQoY29uc3QgUmVuZGVySW5saW5lJiBjaGlsZCkKLXsKLSAgICByZXR1cm4g
Y2hpbGQubWFyZ2luRW5kKCkgKyBjaGlsZC5wYWRkaW5nRW5kKCkgKyBjaGlsZC5ib3JkZXJFbmQo
KTsKLX0KLQotaW5saW5lIGJvb2wgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihSZW5kZXJP
YmplY3QqIGNoaWxkKQotewotICAgIGlmICghY2hpbGQpCi0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIC8vIFdoZW4gZGVjaWRpbmcgd2hldGhlciB3ZSdyZSBhdCB0aGUgZWRnZSBvZiBhbiBpbmxp
bmUsIGFkamFjZW50IGNvbGxhcHNlZCB3aGl0ZXNwYWNlIGlzIHRoZSBzYW1lIGFzIG5vIHNpYmxp
bmcgYXQgYWxsLgotICAgIGlmIChpczxSZW5kZXJUZXh0PigqY2hpbGQpICYmICFkb3duY2FzdDxS
ZW5kZXJUZXh0PigqY2hpbGQpLnRleHRMZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0j
aWYgRU5BQkxFKENTU19CT1hfREVDT1JBVElPTl9CUkVBSykKLSAgICBpZiAoaXM8UmVuZGVyTGlu
ZUJyZWFrPigqY2hpbGQpICYmIGNoaWxkLT5wYXJlbnQoKS0+c3R5bGUoKS5ib3hEZWNvcmF0aW9u
QnJlYWsoKSA9PSBEQ0xPTkUpCi0gICAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1pbmxpbmUgUmVuZGVyT2JqZWN0KiBwcmV2aW91c0luRmxvd1NpYmxp
bmcoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBkbyB7Ci0gICAgICAgIGNoaWxkID0gY2hp
bGQtPnByZXZpb3VzU2libGluZygpOwotICAgIH0gd2hpbGUgKGNoaWxkICYmIGNoaWxkLT5pc091
dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgcmV0dXJuIGNoaWxkOwotfQotCi1pbmxpbmUgTGF5
b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lkdGgoUmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVj
a1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wgY2hlY2tFbmRFZGdlID0gdHJ1ZSkKLXsKLSAgICB1bnNp
Z25lZCBsaW5lRGVwdGggPSAxOwotICAgIExheW91dFVuaXQgZXh0cmFXaWR0aCA9IDA7Ci0gICAg
UmVuZGVyRWxlbWVudCogcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOwotICAgIHdoaWxlIChpczxS
ZW5kZXJJbmxpbmU+KCpwYXJlbnQpICYmIGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0aCkgewot
ICAgICAgICBjb25zdCBhdXRvJiBwYXJlbnRBc1JlbmRlcklubGluZSA9IGRvd25jYXN0PFJlbmRl
cklubGluZT4oKnBhcmVudCk7Ci0gICAgICAgIGlmICghaXNFbXB0eUlubGluZShwYXJlbnRBc1Jl
bmRlcklubGluZSkpIHsKLSAgICAgICAgICAgIGNoZWNrU3RhcnRFZGdlID0gY2hlY2tTdGFydEVk
Z2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmco
Y2hpbGQpKTsKLSAgICAgICAgICAgIGlmIChjaGVja1N0YXJ0RWRnZSkKLSAgICAgICAgICAgICAg
ICBleHRyYVdpZHRoICs9IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChwYXJlbnRBc1JlbmRlcklu
bGluZSk7Ci0gICAgICAgICAgICBjaGVja0VuZEVkZ2UgPSBjaGVja0VuZEVkZ2UgJiYgc2hvdWxk
QWRkQm9yZGVyUGFkZGluZ01hcmdpbihjaGlsZC0+bmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAg
ICBpZiAoY2hlY2tFbmRFZGdlKQotICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVy
UGFkZGluZ01hcmdpbkVuZChwYXJlbnRBc1JlbmRlcklubGluZSk7Ci0gICAgICAgICAgICBpZiAo
IWNoZWNrU3RhcnRFZGdlICYmICFjaGVja0VuZEVkZ2UpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGV4dHJhV2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBwYXJlbnQ7Ci0gICAgICAg
IHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dHJhV2lkdGg7
Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRp
b25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKQotewotICAgIC8vIElm
IG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhc24ndCBhbiBpbmxpbmUgdHlwZSwgdGhlbiB3ZSBjYW4K
LSAgICAvLyBnbyBhaGVhZCBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgaW5saW5lIHBvc2l0aW9u
IG5vdy4KLSAgICBhdXRvJiBib3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQucmVu
ZGVyZXIoKSk7Ci0gICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3guc3R5bGUoKS5pc09yaWdpbmFs
RGlzcGxheUlubGluZVR5cGUoKTsKLSAgICBpZiAoIWlzSW5saW5lVHlwZSkKLSAgICAgICAgbV9i
bG9jay5zZXRTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGJveCwgbV9ibG9jay5sb2dpY2Fs
SGVpZ2h0KCksIG1fYmxvY2suc3RhcnRPZmZzZXRGb3JDb250ZW50KG1fYmxvY2subG9naWNhbEhl
aWdodCgpKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5
IHdhcyBhbiBJTkxJTkUgdHlwZSwgdGhlbiB3ZSBjYW4gZ28gYWhlYWQKLSAgICAgICAgLy8gYW5k
IGRldGVybWluZSBvdXIgc3RhdGljIHkgcG9zaXRpb24gbm93LgotICAgICAgICBib3gubGF5ZXIo
KS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAg
fQotCi0gICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRvIHN0b3AgYW5k
IGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFj
ZXMgYWdhaW4uCi0gICAgaWYgKGlzSW5saW5lVHlwZSB8fCBib3guY29udGFpbmVyKCktPmlzUmVu
ZGVySW5saW5lKCkpIHsKLSAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCi0gICAgICAgICAg
ICBtX2xpbmVNaWRwb2ludFN0YXRlLmVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKCZi
b3gpOwotICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZCgmYm94KTsK
LSAgICB9IGVsc2UKLSAgICAgICAgcG9zaXRpb25lZE9iamVjdHMuYXBwZW5kKCZib3gpOwotCi0g
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aCgmYm94KSk7
Ci0gICAgLy8gUmVzZXQgcHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMuCi0gICAg
bV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7
Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRmxvYXQoKQotewotICAg
IGF1dG8mIGZsb2F0Qm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9jdXJyZW50LnJlbmRlcmVy
KCkpOwotICAgIEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCA9IG1fbGluZUJyZWFrZXIu
aW5zZXJ0RmxvYXRpbmdPYmplY3QoZmxvYXRCb3gpOwotICAgIC8vIGNoZWNrIGlmIGl0IGZpdHMg
aW4gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAvLyBJZiBpdCBkb2VzLCBwb3NpdGlvbiBpdCBub3cs
IG90aGVyd2lzZSwgcG9zaXRpb24KLSAgICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8gbmV4dCBsaW5l
IChpbiBjbGVhckZsb2F0cygpIGZ1bmMpCi0gICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYmIG1f
d2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2lj
YWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKLSAgICAgICAgbV9saW5lQnJlYWtl
ci5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOwotICAgICAgICBpZiAobV9saW5lQnJl
YWsucmVuZGVyZXIoKSA9PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgewotICAgICAgICAgICAgQVNT
RVJUKCFtX2xpbmVCcmVhay5vZmZzZXQoKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNy
ZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBtX2Zsb2F0c0ZpdE9uTGlu
ZSA9IGZhbHNlOwotICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFj
dGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxv
YXRpbmcgZWxlbWVudC4KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iu
dXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKLX0KLQotLy8gVGhpcyBp
cyBjdXJyZW50bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0
aGF0IGhhdmUgbGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKLS8vIGhhdmUgYW4gZWZmZWN0IG9u
IHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotaW5saW5lIGJvb2wgc2hvdWxk
U2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJl
bmRlck9iamVjdCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQotewot
ICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxv
Y2ssIG8pOwotICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bv
c2l0aW9uZWQoKSkKLSAgICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMo
YmxvY2ssIG5leHQpOwotCi0gICAgaWYgKGlzPFJlbmRlclRleHQ+KG5leHQpICYmIGRvd25jYXN0
PFJlbmRlclRleHQ+KCpuZXh0KS50ZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFJlbmRlclRl
eHQmIG5leHRUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm5leHQpOwotICAgICAgICBVQ2hh
ciBuZXh0Q2hhciA9IG5leHRUZXh0LmNoYXJhY3RlckF0KDApOwotICAgICAgICBpZiAobmV4dFRl
eHQuc3R5bGUoKS5pc0NvbGxhcHNpYmxlV2hpdGVTcGFjZShuZXh0Q2hhcikpIHsKLSAgICAgICAg
ICAgIGxpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3Io
bnVsbHB0ciwgbywgMCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4
dDo6aGFuZGxlRW1wdHlJbmxpbmUoKQotewotICAgIFJlbmRlcklubGluZSYgZmxvd0JveCA9IGRv
d25jYXN0PFJlbmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKLQotICAgIC8vIFRo
aXMgc2hvdWxkIG9ubHkgZW5kIHVwIGJlaW5nIGNhbGxlZCBvbiBlbXB0eSBpbmxpbmVzCi0gICAg
QVNTRVJUKGlzRW1wdHlJbmxpbmUoZmxvd0JveCkpOwotCi0gICAgLy8gTm93IHRoYXQgc29tZSBp
bmxpbmUgZmxvd3MgaGF2ZSBsaW5lIGJveGVzLCBpZiB3ZSBhcmUgYWxyZWFkeSBpZ25vcmluZyBz
cGFjZXMsIHdlIG5lZWQKLSAgICAvLyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzdG9wIHRvIGluY2x1
ZGUgdGhpcyBvYmplY3QgYW5kIHRoZW4gc3RhcnQgaWdub3Jpbmcgc3BhY2VzIGFnYWluLgotICAg
IC8vIElmIHRoaXMgb2JqZWN0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwgd2UgbmVlZCB0
byBiZWhhdmUgbGlrZSBsaXN0IG1hcmtlcnMgYW5kCi0gICAgLy8gc3RhcnQgaWdub3Jpbmcgc3Bh
Y2VzLgotICAgIGJvb2wgcmVxdWlyZXNMaW5lQm94ID0gYWx3YXlzUmVxdWlyZXNMaW5lQm94KGZs
b3dCb3gpOwotICAgIGlmIChyZXF1aXJlc0xpbmVCb3ggfHwgcmVxdWlyZXNMaW5lQm94Rm9yQ29u
dGVudChmbG93Qm94LCBtX2xpbmVJbmZvKSkgewotICAgICAgICAvLyBBbiBlbXB0eSBpbmxpbmUg
dGhhdCBvbmx5IGhhcyBsaW5lLWhlaWdodCwgdmVydGljYWwtYWxpZ24gb3IgZm9udC1tZXRyaWNz
IHdpbGwgb25seSBnZXQgYQotICAgICAgICAvLyBsaW5lIGJveCB0byBhZmZlY3QgdGhlIGhlaWdo
dCBvZiB0aGUgbGluZSBpZiB0aGUgcmVzdCBvZiB0aGUgbGluZSBpcyBub3QgZW1wdHkuCi0gICAg
ICAgIGlmIChyZXF1aXJlc0xpbmVCb3gpCi0gICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5
KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwotICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNl
cykgewotICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLSAgICAgICAgICAg
IG1fbGluZU1pZHBvaW50U3RhdGUuZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9j
dXJyZW50LnJlbmRlcmVyKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5jb2xs
YXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBvc2l0aW9uKCkucmVuZGVyZXIoKSA9PSBt
X2N1cnJlbnQucmVuZGVyZXIoKQotICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VB
ZnRlclN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2xpbmVNaWRw
b2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFya2Vycywgd2Ug
c3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQotICAgICAgICAgICAg
Ly8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAg
ICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICBtX2N1cnJl
bnRDaGFyYWN0ZXJJc1dTID0gdHJ1ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0
cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFwcGVu
ZEJveElmTmVlZGVkKCZmbG93Qm94KTsKLSAgICB9Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29tbWl0
dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5kZXJlcigpKSArIGJvcmRl
clBhZGRpbmdNYXJnaW5TdGFydChmbG93Qm94KSArIGJvcmRlclBhZGRpbmdNYXJnaW5FbmQoZmxv
d0JveCkpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVJlcGxhY2Vk
KCkKLXsKLSAgICBhdXRvJiByZXBsYWNlZEJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fY3Vy
cmVudC5yZW5kZXJlcigpKTsKLQotICAgIGlmIChtX2F0U3RhcnQpCi0gICAgICAgIG1fd2lkdGgu
dXBkYXRlQXZhaWxhYmxlV2lkdGgocmVwbGFjZWRCb3gubG9naWNhbEhlaWdodCgpKTsKLQotICAg
IC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRl
LXNwYWNlLgotICAgIGlmICgobV9hdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9s
YXN0V1MpKSAmJiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0lt
YWdlc1RvQnJlYWspCi0gICAgICAgICYmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUnVieVJ1
bigpIHx8IGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG1fY3VycmVudC5yZW5kZXJlcigpKS0+Y2Fu
QnJlYWtCZWZvcmUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yKSkpIHsKLSAg
ICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigp
KTsKLSAgICB9Ci0KLSAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgbV9saW5lTWlk
cG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50
LnJlbmRlcmVyKCksIDApKTsKLQotICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Js
b2NrLCAmbV93aWR0aCk7Ci0gICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwotICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dT
ID0gZmFsc2U7Ci0gICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLQotICAgIC8vIE9wdGlt
aXplIGZvciBhIGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3BhY2UgYWZ0ZXIg
dGhlIGxpc3QKLSAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCi0gICAgTGF5b3V0
VW5pdCByZXBsYWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRoRm9yQ2hpbGQo
cmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxhY2VkQm94KSAr
IG1fYmxvY2subWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5lTG9naWNhbFdp
ZHRoKG1fY3VycmVudC5yZW5kZXJlcigpKTsKLSAgICBpZiAoaXM8UmVuZGVyTGlzdE1hcmtlcj4o
Km1fY3VycmVudC5yZW5kZXJlcigpKSkgewotICAgICAgICBpZiAobV9ibG9ja1N0eWxlLmNvbGxh
cHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCht
X2Jsb2NrLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9saW5lTWlkcG9pbnRTdGF0ZSkpIHsKLSAg
ICAgICAgICAgIC8vIExpa2Ugd2l0aCBpbmxpbmUgZmxvd3MsIHdlIHN0YXJ0IGlnbm9yaW5nIHNw
YWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKLSAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgc3Bh
Y2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9
IGZhbHNlOwotICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7Ci0gICAgICAgIH0K
LSAgICAgICAgaWYgKGRvd25jYXN0PFJlbmRlckxpc3RNYXJrZXI+KCptX2N1cnJlbnQucmVuZGVy
ZXIoKSkuaXNJbnNpZGUoKSkKLSAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0
aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fd2lkdGguYWRk
VW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKGlzPFJlbmRl
clJ1YnlSdW4+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpIHsKLSAgICAgICAgbV93aWR0aC5hcHBs
eU92ZXJoYW5nKGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG1fY3VycmVudC5yZW5kZXJlcigpKSwg
bV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOwotICAgICAgICBkb3duY2FzdDxSZW5kZXJSdWJ5
UnVuPihtX2N1cnJlbnQucmVuZGVyZXIoKSktPnVwZGF0ZVByaW9yQ29udGV4dEZyb21DYWNoZWRC
cmVha0l0ZXJhdG9yKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvcik7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgLy8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFy
YWN0ZXJzLCB1c2luZyBVK0ZGRkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciBy
ZXBsYWNlZCBlbGVtZW50LgotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRl
cmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKLSAgICB9Ci19
Ci0KLWlubGluZSBmbG9hdCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1cmVtZW50
cyYgd29yZE1lYXN1cmVtZW50cykKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRN
ZWFzdXJlbWVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudHNb
aV0ud2lkdGggPiAwKQotICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNbaV0ud2lk
dGg7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbmxpbmUgYm9vbCBpdGVyYXRvcklzQmV5
b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXRlciwgUmVu
ZGVyQ29tYmluZVRleHQmIHJlbmRlcmVyKQotewotICAgIHJldHVybiBpdGVyLnJlbmRlcmVyKCkg
PT0gJnJlbmRlcmVyICYmIGl0ZXIub2Zmc2V0KCkgPj0gcmVuZGVyZXIudGV4dExlbmd0aCgpOwot
fQotCi1pbmxpbmUgdm9pZCBuZXh0Q2hhcmFjdGVyKFVDaGFyJiBjdXJyZW50Q2hhcmFjdGVyLCBV
Q2hhciYgbGFzdENoYXJhY3RlciwgVUNoYXImIHNlY29uZFRvTGFzdENoYXJhY3RlcikKLXsKLSAg
ICBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIgPSBsYXN0Q2hhcmFjdGVyOwotICAgIGxhc3RDaGFyYWN0
ZXIgPSBjdXJyZW50Q2hhcmFjdGVyOwotfQotCi0vLyBGSVhNRTogRG9uJ3QgbGV0IGNvdW50ZXJz
IG1hcmsgdGhlbXNlbHZlcyBhcyBuZWVkaW5nIHByZWYgd2lkdGggcmVjYWxjcyBkdXJpbmcgbGF5
b3V0Ci0vLyBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgaGFjay4KLWlubGluZSB2b2lkIHVwZGF0ZUNv
dW50ZXJJZk5lZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQotewotICAgIGlmICghcmVuZGVy
VGV4dC5wcmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHkoKSB8fCAhaXM8UmVuZGVyQ291bnRlcj4o
cmVuZGVyVGV4dCkpCi0gICAgICAgIHJldHVybjsKLSAgICBkb3duY2FzdDxSZW5kZXJDb3VudGVy
PihyZW5kZXJUZXh0KS51cGRhdGVDb3VudGVyKCk7Ci19Ci0KLWlubGluZSBmbG9hdCBtZWFzdXJl
SHlwaGVuV2lkdGgoUmVuZGVyVGV4dCogcmVuZGVyZXIsIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250
LCBIYXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cyA9IDApCi17Ci0gICAgY29uc3Qg
UmVuZGVyU3R5bGUmIHN0eWxlID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZvbnQu
d2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0eWxl
Lmh5cGhlblN0cmluZygpLnN0cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOwotfQotCi1B
TFdBWVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBm
cm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250LCBmbG9hdCB4UG9zLCBi
b29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIEhhc2hTZXQ8Y29uc3Qg
Rm9udCo+JiBmYWxsYmFja0ZvbnRzLCBUZXh0TGF5b3V0KiBsYXlvdXQgPSAwKQotewotICAgIGNv
bnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxlKCk7Ci0KLSAgICBHbHlwaE92ZXJm
bG93IGdseXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVu
ID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENvbWJpbmUoKSkKLSAgICAg
ICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9u
dHMsICZnbHlwaE92ZXJmbG93KTsKLQotICAgIGlmIChsYXlvdXQpCi0gICAgICAgIHJldHVybiBG
b250Q2FzY2FkZTo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7Ci0K
LSAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZv
bnQsIHRleHQsIGZyb20sIGxlbiwgc3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3Ro
KHRleHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOwotICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xl
bmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7Ci0KLSAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNv
ZGVQYXRoKCF0ZXh0LT5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7Ci0gICAgcnVuLnNldFRh
YlNpemUoIWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKLSAgICBydW4uc2V0
WFBvcyh4UG9zKTsKLSAgICByZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAm
Z2x5cGhPdmVyZmxvdyk7Ci19Ci0KLS8vIEFkZGluZyBhIHBhaXIgb2YgbWlkcG9pbnRzIGJlZm9y
ZSBhIGNoYXJhY3RlciB3aWxsIHNwbGl0IGl0IG91dCBpbnRvIGEgbmV3IGxpbmUgYm94LgotaW5s
aW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3goTGluZU1pZHBvaW50U3RhdGUmIGxp
bmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgdGV4dFBhcmFncmFwaFNlcGFyYXRvcikK
LXsKLSAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9y
LnJlbmRlcmVyKCksIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3Iub2Zmc2V0KCkpOwotICAgIGxpbmVN
aWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBh
cmFncmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNl
dCgpIC0gMSkpOwotICAgIGxpbmVNaWRwb2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNlcyhJbmxp
bmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLnJlbmRlcmVyKCksIHRleHRQYXJh
Z3JhcGhTZXBhcmF0b3Iub2Zmc2V0KCkpKTsKLX0KLQotaW5saW5lIHZvaWQgdHJ5SHlwaGVuYXRp
bmcoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNvbnN0IEF0b21p
Y1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQgbWluaW11bVBy
ZWZpeExpbWl0LCBpbnQgbWluaW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0U3BhY2UsIHVu
c2lnbmVkIHBvcywgZmxvYXQgeFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29sIGlzRml4ZWRQ
aXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3JkU3BhY2luZywg
SW5saW5lSXRlcmF0b3ImIGxpbmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJvb2wmIGh5cGhl
bmF0ZWQpCi17Ci0gICAgLy8gTWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxhZnRlcn06IGF1
dG87JyB0byAyLgotICAgIHVuc2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7Ci0gICAgdW5zaWdu
ZWQgbWluaW11bVN1ZmZpeExlbmd0aDsKLQotICAgIGlmIChtaW5pbXVtUHJlZml4TGltaXQgPCAw
KQotICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gMjsKLSAgICBlbHNlCi0gICAgICAgIG1p
bmltdW1QcmVmaXhMZW5ndGggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVByZWZpeExp
bWl0KTsKLQotICAgIGlmIChtaW5pbXVtU3VmZml4TGltaXQgPCAwKQotICAgICAgICBtaW5pbXVt
U3VmZml4TGVuZ3RoID0gMjsKLSAgICBlbHNlCi0gICAgICAgIG1pbmltdW1TdWZmaXhMZW5ndGgg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVN1ZmZpeExpbWl0KTsKLQotICAgIGlmIChw
b3MgLSBsYXN0U3BhY2UgPD0gbWluaW11bVN1ZmZpeExlbmd0aCkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgaWYgKGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQgPj0gMCAmJiBjb25zZWN1
dGl2ZUh5cGhlbmF0ZWRMaW5lcyA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXNMaW1pdCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCBoeXBoZW5X
aWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aCh0ZXh0LCBmb250KTsKLQotICAgIGZsb2F0IG1heFBy
ZWZpeFdpZHRoID0gYXZhaWxhYmxlV2lkdGggLSB4UG9zIC0gaHlwaGVuV2lkdGggLSBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKLSAgICAvLyBJZiB0aGUgbWF4aW11bSB3aWR0aCBhdmFpbGFibGUgZm9y
IHRoZSBwcmVmaXggYmVmb3JlIHRoZSBoeXBoZW4gaXMgc21hbGwsIHRoZW4gaXQgaXMgdmVyeSB1
bmxpa2VseQotICAgIC8vIHRoYXQgYW4gaHlwaGVuYXRpb24gb3Bwb3J0dW5pdHkgZXhpc3RzLCBz
byBkbyBub3QgYm90aGVyIHRvIGxvb2sgZm9yIGl0LgotICAgIGlmIChtYXhQcmVmaXhXaWR0aCA8
PSBmb250LnBpeGVsU2l6ZSgpICogNSAvIDQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0
IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxlKCk7Ci0gICAgVGV4dFJ1biBydW4gPSBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBsYXN0U3BhY2Us
IHBvcyAtIGxhc3RTcGFjZSwgc3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRl
eHQtPnRleHRMZW5ndGgoKSAtIGxhc3RTcGFjZSk7Ci0gICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJz
TGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKLQotICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBz
ZVdoaXRlU3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7Ci0gICAgcnVuLnNldFhQb3MoeFBvcyArIGxh
c3RTcGFjZVdvcmRTcGFjaW5nKTsKLQotICAgIHVuc2lnbmVkIHByZWZpeExlbmd0aCA9IGZvbnQu
b2Zmc2V0Rm9yUG9zaXRpb24ocnVuLCBtYXhQcmVmaXhXaWR0aCwgZmFsc2UpOwotICAgIGlmIChw
cmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBwcmVmaXhMZW5ndGggPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyh0ZXh0LT50ZXh0
KCkpLnN1YnN0cmluZyhsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSksIHN0ZDo6bWluKHByZWZp
eExlbmd0aCwgcG9zIC0gbGFzdFNwYWNlIC0gbWluaW11bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2Nh
bGVJZGVudGlmaWVyKTsKLSAgICBpZiAoIXByZWZpeExlbmd0aCB8fCBwcmVmaXhMZW5ndGggPCBt
aW5pbXVtUHJlZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXaGVuIGxhc3RT
cGFjZSBpcyBhIHNwYWNlLCB3aGljaCBpdCBhbHdheXMgaXMgZXhjZXB0IHNvbWV0aW1lcyBhdCB0
aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBvciBhZnRlciBjb2xsYXBzZWQKLSAgICAvLyBzcGFjZSwg
aXQgc2hvdWxkIG5vdCBjb3VudCB0b3dhcmRzIGh5cGhlbmF0ZS1saW1pdC1iZWZvcmUuCi0gICAg
aWYgKHByZWZpeExlbmd0aCA9PSBtaW5pbXVtUHJlZml4TGVuZ3RoKSB7Ci0gICAgICAgIFVDaGFy
IGNoYXJhY3RlckF0TGFzdFNwYWNlID0gdGV4dC0+Y2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKLSAg
ICAgICAgaWYgKGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RT
cGFjZSA9PSAnXG4nIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gbm9CcmVha1NwYWNlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIEFTU0VSVChwb3MgLSBsYXN0U3BhY2UgLSBwcmVmaXhMZW5ndGggPj0gbWluaW11bVN1
ZmZpeExlbmd0aCk7Ci0KLSNpZiAhQVNTRVJUX0RJU0FCTEVECi0gICAgSGFzaFNldDxjb25zdCBG
b250Kj4gZmFsbGJhY2tGb250czsKLSAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRo
ICsgdGV4dFdpZHRoKHRleHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBp
c0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKLSAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJs
ZVdpZHRoKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7Ci0jZW5kaWYK
LQotICAgIGxpbmVCcmVhay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBu
ZXh0QnJlYWthYmxlKTsKLSAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLX0KLQotaW5saW5lIGJvb2wg
QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJl
bWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMpCi17Ci0gICAgaWYgKCFtX2N1cnJlbnQub2Zmc2V0KCkpCi0gICAgICAgIG1fYXBwbGll
ZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQotICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQgPSBkb3du
Y2FzdDxSZW5kZXJUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOwotCi0gICAgYm9vbCBpc1NW
R1RleHQgPSByZW5kZXJUZXh0LmlzU1ZHSW5saW5lVGV4dCgpOwotCi0gICAgLy8gSWYgd2UgaGF2
ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4gYXV0b3dyYXAgaW5saW5lIHdo
aWxlIGlnbm9yaW5nIHNwYWNlcwotICAgIC8vIHRoZW4gd2UgbmVlZCB0byBtYXJrIHRoZSBzdGFy
dCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFsIGxpbmVicmVhayBub3cuCi0g
ICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykgJiYg
bV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgo
cmVuZGVyVGV4dCk7Ci0KLSAgICBpZiAocmVuZGVyVGV4dC5zdHlsZSgpLmhhc1RleHRDb21iaW5l
KCkgJiYgaXM8UmVuZGVyQ29tYmluZVRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgIWRv
d25jYXN0PFJlbmRlckNvbWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpLmlzQ29tYmlu
ZWQoKSkgewotICAgICAgICBhdXRvJiBjb21iaW5lUmVuZGVyZXIgPSBkb3duY2FzdDxSZW5kZXJD
b21iaW5lVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKLSAgICAgICAgY29tYmluZVJlbmRl
cmVyLmNvbWJpbmVUZXh0KCk7Ci0gICAgICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVy
J3MgdGV4dCBtYXkgaGF2ZSBjaGFuZ2VkLiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRp
b25zCi0gICAgICAgIGlmIChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dCht
X2xpbmVCcmVhaywgY29tYmluZVJlbmRlcmVyKSkgewotICAgICAgICAgICAgQVNTRVJUKGl0ZXJh
dG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fcmVzb2x2ZXIucG9zaXRpb24oKSwg
Y29tYmluZVJlbmRlcmVyKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsK
LSAgICAgICAgICAgIG1fcmVzb2x2ZXIuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSBsaW5lU3R5bGUocmVuZGVyVGV4dCwgbV9s
aW5lSW5mbyk7Ci0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBzdHlsZS5mb250Q2FzY2Fk
ZSgpOwotICAgIGJvb2wgaXNGaXhlZFBpdGNoID0gZm9udC5pc0ZpeGVkUGl0Y2goKTsKLSAgICBi
b29sIGNhbkh5cGhlbmF0ZSA9IHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zQXV0byAmJiBXZWJD
b3JlOjpjYW5IeXBoZW5hdGUoc3R5bGUubG9jYWxlKCkpOwotCi0gICAgdW5zaWduZWQgbGFzdFNw
YWNlID0gbV9jdXJyZW50Lm9mZnNldCgpOwotICAgIGZsb2F0IHdvcmRTcGFjaW5nID0gbV9jdXJy
ZW50U3R5bGUtPmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKTsKLSAgICBmbG9hdCBsYXN0U3Bh
Y2VXb3JkU3BhY2luZyA9IDA7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1l
bnQgPSAwOwotCi0gICAgZmxvYXQgd3JhcFcgPSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAr
IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSwgIW1fYXBwbGllZFN0YXJ0
V2lkdGgsIHRydWUpOwotICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7Ci0gICAgYm9vbCBicmVha05C
U1AgPSBtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5uYnNwTW9kZSgpID09IFNQQUNFOwot
ICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEg
d29yZCBvbmx5IGlmIGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9yZSB0aGUgd29yZCwKLSAgICAvLyB3
aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0
aGUgbGluZSwgdGhhdCBpcywgaWYgfHd8IGlzIHplcm8uCi0gICAgYm9vbCBicmVha1dvcmRzID0g
bV9jdXJyZW50U3R5bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1fYXV0b1dyYXAgJiYgIW1fd2lkdGgu
Y29tbWl0dGVkV2lkdGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJFKTsKLSAgICBib29sIG1pZFdvcmRC
cmVhayA9IGZhbHNlOwotICAgIGJvb2wgYnJlYWtBbGwgPSBtX2N1cnJlbnRTdHlsZS0+d29yZEJy
ZWFrKCkgPT0gQnJlYWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRvV3JhcDsKLSAgICBmbG9hdCBoeXBo
ZW5XaWR0aCA9IDA7Ci0gICAgYm9vbCBpc0xvb3NlQ0pLTW9kZSA9IGZhbHNlOwotCi0gICAgaWYg
KGlzU1ZHVGV4dCkgewotICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7Ci0gICAgICAgIGJyZWFr
QWxsID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV90ZXh0ICE9
ICZyZW5kZXJUZXh0KSB7Ci0gICAgICAgIHVwZGF0ZUNvdW50ZXJJZk5lZWRlZChyZW5kZXJUZXh0
KTsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgPSAmcmVuZGVyVGV4dDsKLSAgICAg
ICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0
SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KCZyZW5kZXJUZXh0LCBtX3dpZHRoLmN1
cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7Ci0gICAgICAgIG1fcmVuZGVyVGV4
dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0FuZFJlbGVhc2VJdGVyYXRvcihy
ZW5kZXJUZXh0LnRleHQoKSwgc3R5bGUubG9jYWxlKCksIG1hcExpbmVCcmVha1RvSXRlcmF0b3JN
b2RlKG1fYmxvY2tTdHlsZS5saW5lQnJlYWsoKSkpOwotICAgICAgICBpc0xvb3NlQ0pLTW9kZSA9
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5pc0xvb3NlQ0pLTW9kZSgpOwot
ICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCAmJiBtX3JlbmRlclRleHRJ
bmZvLm1fZm9udCAhPSAmZm9udCkgewotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9
ICZmb250OwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVM
YXlvdXQoJnJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0
ZVNwYWNlKTsKLSAgICB9Ci0KLSAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJU
ZXh0SW5mby5tX2xheW91dC5nZXQoKTsKLQotICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJu
aW5nIGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3
ZSBtZWFzdXJlCi0gICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBz
dWJ0cmFjdCBpdHMgd2lkdGguCi0gICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250
czsKLSAgICBmbG9hdCB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoID0gKGZvbnQudHlwZXNldHRpbmdG
ZWF0dXJlcygpICYgS2VybmluZykgJiYgIXRleHRMYXlvdXQgPyBmb250LndpZHRoKFJlbmRlckJs
b2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEsIHN0eWxl
KSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOwotCi0gICAgVUNoYXIgbGFzdENo
YXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0Q2hhcmFj
dGVyKCk7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOwotICAgIGZvciAo
OyBtX2N1cnJlbnQub2Zmc2V0KCkgPCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKTsgbV9jdXJyZW50
LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKLSAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJh
Y3RlcklzU3BhY2UgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwotICAgICAgICBib29sIHBy
ZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENoYXJhY3RlcklzV1M7Ci0gICAgICAgIFVD
aGFyIGMgPSBtX2N1cnJlbnQuY3VycmVudCgpOwotICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8ICghbV9wcmVzZXJ2ZXNOZXdsaW5lICYm
IChjID09ICdcbicpKTsKLQotICAgICAgICBpZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNlIHx8ICFt
X2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0
eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLQotICAgICAgICBpZiAoYyA9PSBzb2Z0SHlw
aGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBI
eXBoZW5zTm9uZSkgewotICAgICAgICAgICAgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lk
dGgoJnJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIG1fd2lk
dGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLQotICAgICAgICBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYmIGMg
PT0gbm9CcmVha1NwYWNlKTsKLQotICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMp
ICYmICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0eWxl
LndoaXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKLSAgICAgICAgICAgIHdyYXBXICs9IGNoYXJX
aWR0aDsKLSAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWly
ID0gVTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm9mZnNldCgpICsgMSA8IHJlbmRlclRleHQu
dGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTChyZW5kZXJUZXh0W21fY3VycmVudC5vZmZzZXQo
KSArIDFdKTsKLSAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aCgmcmVuZGVyVGV4dCwg
bV9jdXJyZW50Lm9mZnNldCgpLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAy
IDogMSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRj
aCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwotICAg
ICAgICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcg
KyBjaGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gbV9jdXJyZW50Lm5leHRCcmVha2FibGVQ
b3NpdGlvbigpOwotICAgICAgICBib29sIGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9j
dXJyV1MgIT0gUFJFICYmICFtX2F0U3RhcnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLCBtX2N1cnJlbnQub2Zmc2V0KCksIG5leHRCcmVha2FibGVQ
b3NpdGlvbiwgYnJlYWtOQlNQLCBpc0xvb3NlQ0pLTW9kZSkKLSAgICAgICAgICAgICYmIChzdHls
ZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUgfHwgKG1fY3VycmVudC5wcmV2aW91c0luU2FtZU5v
ZGUoKSAhPSBzb2Z0SHlwaGVuKSkpOwotICAgICAgICBtX2N1cnJlbnQuc2V0TmV4dEJyZWFrYWJs
ZVBvc2l0aW9uKG5leHRCcmVha2FibGVQb3NpdGlvbik7Ci0KLSAgICAgICAgaWYgKGJldHdlZW5X
b3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgIGJvb2wgc3RvcHBlZElnbm9yaW5n
U3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykgewotICAg
ICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKLSAgICAgICAgICAgICAgICBp
ZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
U3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKLSAgICAgICAgICAgICAgICAg
ICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50
ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm9mZnNldCgp
OyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQg
c3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0b3BJZ25v
cmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJy
ZW50Lm9mZnNldCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRJZ25vcmluZ1NwYWNl
cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gSnVzdCBrZWVwIGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4KLSAgICAgICAgICAgICAgICAgICAg
bmV4dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3b3JkTWVhc3VyZW1l
bnRzLnNpemUoKSArIDEpOwotICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3Vy
ZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKTsKLQotICAgICAgICAgICAgd29yZE1lYXN1
cmVtZW50LnJlbmRlcmVyID0gJnJlbmRlclRleHQ7Ci0gICAgICAgICAgICB3b3JkTWVhc3VyZW1l
bnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOwotICAgICAgICAgICAgd29yZE1lYXN1
cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOwotCi0gICAgICAgICAgICBmbG9hdCBhZGRp
dGlvbmFsVGVtcFdpZHRoOwotICAgICAgICAgICAgaWYgKHdvcmRUcmFpbGluZ1NwYWNlV2lkdGgg
JiYgYyA9PSAnICcpCi0gICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRX
aWR0aCgmcmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCkgKyAxIC0gbGFz
dFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91
dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgoJnJlbmRlclRleHQsIGxhc3RT
cGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJl
bnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3Vy
ZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7Ci0KLSAgICAgICAgICAgIGlmICh3b3Jk
TWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNF
bXB0eSgpKQotICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3
YXAoZmFsbGJhY2tGb250cyk7Ci0gICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0K
LSAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGFkZGl0aW9uYWxUZW1wV2lkdGgg
KyB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICAgICAgICAgIGFkZGl0aW9uYWxU
ZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgICAgICAgICBtX3dpZHRoLmFk
ZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7Ci0KLSAgICAgICAgICAgIGlm
IChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgJiYgbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRoKQotICAgICAgICAg
ICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRkaXRpb25hbFRlbXBX
aWR0aCk7Ci0KLSAgICAgICAgICAgIGlmICghbV9hcHBsaWVkU3RhcnRXaWR0aCkgewotICAgICAg
ICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgo
bV9jdXJyZW50LnJlbmRlcmVyKCksIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgbV9h
cHBsaWVkU3RhcnRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFw
cGx5V29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
OwotCi0gICAgICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX2F1dG9X
cmFwICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmZp
dEJlbG93RmxvYXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7Ci0KLSAgICAgICAgICAgIGlm
IChtX2F1dG9XcmFwIHx8IGJyZWFrV29yZHMpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBi
cmVhayBvbmx5IGFmdGVyIHdoaXRlLXNwYWNlLCBjb25zaWRlciB0aGUgY3VycmVudCBjaGFyYWN0
ZXIKLSAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4K
LSAgICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzV1Mg
JiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3Jk
QnJlYWspIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRo
KCZyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zmc2V0KCksIDEsIGZvbnQsIG1fd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29y
ZFNwYWNpbmcgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBpcyB0
b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAg
Ly8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgotICAg
ICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVzcGFj
ZSB0byBiZSB0b28gbG9uZywKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBtb3ZlIHRoZSBs
aW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKLSAgICAgICAgICAgICAgICAgICAg
Ly8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBpZiAoIW1fd2lk
dGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQu
b2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBUcmFpbGluZ1doaXRlc3BhY2UobV9saW5l
QnJlYWssIG1fbGluZUluZm8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9vV2lkZSB8fCAhbV93aWR0aC5maXRz
T25MaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSAmJiAhbV93
aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0
aW5nKCZyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlw
aGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFz
dFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRp
dGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwg
bV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywg
bV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVCcmVha2VyLm1faHlwaGVu
YXRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5cGhl
bmF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYg
KG1fbGluZUJyZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0
KCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNM
aW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9m
ZnNldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICht
X2xpbmVCcmVhay5vZmZzZXQoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PihtX2xpbmVCcmVhay5y
ZW5kZXJlcigpKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9saW5lQnJlYWsucmVuZGVyZXIo
KSkudGV4dExlbmd0aCgpICYmIGRvd25jYXN0PFJlbmRlclRleHQ+KCptX2xpbmVCcmVhay5yZW5k
ZXJlcigpKS5jaGFyYWN0ZXJBdChtX2xpbmVCcmVhay5vZmZzZXQoKSAtIDEpID09IHNvZnRIeXBo
ZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKQotICAgICAgICAgICAgICAgICAg
ICAgICAgaHlwaGVuYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVC
cmVhay5vZmZzZXQoKSAmJiBtX2xpbmVCcmVhay5vZmZzZXQoKSAhPSAodW5zaWduZWQpd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNldCgpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGNoYXJX
aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBlbmQgdW5sZXNz
IHRoZXJlJ3Mgc3RpbGwgYW4gb3Bwb3J0dW5pdHkgdG8gY29sbGFwc2Ugd2hpdGVzcGFjZS4KLSAg
ICAgICAgICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgfHwgIW1fY29sbGFwc2VXaGl0
ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8ICFwcmV2aW91c0NoYXJhY3Rl
cklzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXR3
ZWVuV29yZHMgfHwgKG1pZFdvcmRCcmVhayAmJiAhbV9hdXRvV3JhcCkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWFkZGl0aW9uYWxUZW1wV2lk
dGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHlwaGVuV2lkdGgpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBoZW4gb3V0
IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRo
LmFkZFVuY29tbWl0dGVkV2lkdGgoLWh5cGhlbldpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGh5cGhlbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBtX3By
ZXNlcnZlc05ld2xpbmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1Nw
YWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkpCi0gICAgICAgICAgICAgICAgICAgIGVuc3VyZUNo
YXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAg
ICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5k
ZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRp
b24oKSk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAg
ICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGlmIChtX2F1dG9XcmFwICYmIGJldHdlZW5Xb3JkcykgewotICAgICAgICAgICAgICAgIGNvbW1p
dExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50
Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAg
ICAgICAgIHdyYXBXID0gMDsKLSAgICAgICAgICAgICAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQg
c2hvdWxkIG5vdCB3cmFwIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkIG9uY2UgaXQgaGFzIGhhZCBh
bgotICAgICAgICAgICAgICAgIC8vIG9wcG9ydHVuaXR5IHRvIGJyZWFrIGFmdGVyIGEgd29yZC4K
LSAgICAgICAgICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGlmIChtaWRXb3JkQnJlYWsgJiYgIVUxNl9JU19UUkFJTChjKSAmJiAhKFVfR0VU
X0dDX01BU0soYykgJiBVX0dDX01fTUFTSykpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1lbWJl
ciB0aGlzIGFzIGEgYnJlYWthYmxlIHBvc2l0aW9uIGluIGNhc2UKLSAgICAgICAgICAgICAgICAv
LyBhZGRpbmcgdGhlIGVuZCB3aWR0aCBmb3JjZXMgYSBicmVhay4KLSAgICAgICAgICAgICAgICBt
X2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQo
KSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICBt
aWRXb3JkQnJlYWsgJj0gKGJyZWFrV29yZHMgfHwgYnJlYWtBbGwpOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoYmV0d2VlbldvcmRzKSB7Ci0gICAgICAgICAgICAgICAgbGFzdFNw
YWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOwotICAg
ICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNw
YWNpbmcgJiYgd29yZE1lYXN1cmVtZW50LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAg
ICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQub2Zmc2V0KCk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmICghbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+
Y29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50
ZXIgYSBuZXdsaW5lLCBvciBpZiB3ZSBlbmNvdW50ZXIgYQotICAgICAgICAgICAgICAgIC8vIHNl
Y29uZCBzcGFjZSwgd2UgbmVlZCB0byBnbyBhaGVhZCBhbmQgYnJlYWsgdXAgdGhpcwotICAgICAg
ICAgICAgICAgIC8vIHJ1biBhbmQgZW50ZXIgYSBtb2RlIHdoZXJlIHdlIHN0YXJ0IGNvbGxhcHNp
bmcgc3BhY2VzLgotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
ICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICBtX2ln
bm9yaW5nU3BhY2VzID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IGVu
dGVyZWQgYSBtb2RlIHdoZXJlIHdlIGFyZSBpZ25vcmluZwotICAgICAgICAgICAgICAgICAgICAv
LyBzcGFjZXMuIENyZWF0ZSBhIG1pZHBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgcnVuCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIHNwYWNlLgotICAgICAgICAgICAgICAg
ICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMobV9zdGFydE9mSWdu
b3JlZFNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0
ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRl
cmF0b3IoKSwgVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1faWdub3Jp
bmdTcGFjZXMpIHsKLSAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdp
biBhdCB0aGlzCi0gICAgICAgICAgICAvLyBuZXcgcG9pbnQuCi0gICAgICAgICAgICBtX2lnbm9y
aW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFw
cGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICB3b3JkU3BhY2lu
Z0ZvcldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVu
dHMubGFzdCgpLndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgIGxhc3RTcGFj
ZSA9IG1fY3VycmVudC5vZmZzZXQoKTsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQg
aW4gYW55IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAgICAgICAgIG1fbGluZU1pZHBvaW50
U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5k
ZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChp
c1NWR1RleHQgJiYgbV9jdXJyZW50Lm9mZnNldCgpKSB7Ci0gICAgICAgICAgICAvLyBGb3JjZSBj
cmVhdGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25lZCBj
aGFyYWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KLSAgICAgICAgICAg
IGlmIChkb3duY2FzdDxSZW5kZXJTVkdJbmxpbmVUZXh0PihyZW5kZXJUZXh0KS5jaGFyYWN0ZXJT
dGFydHNOZXdUZXh0Q2h1bmsobV9jdXJyZW50Lm9mZnNldCgpKSkKLSAgICAgICAgICAgICAgICBl
bnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQp
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYg
IXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgbV9zdGFydE9mSWdub3Jl
ZFNwYWNlcy5zZXRSZW5kZXJlcihtX2N1cnJlbnQucmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBt
X3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldE9mZnNldChtX2N1cnJlbnQub2Zmc2V0KCkpOwotICAg
ICAgICAgICAgLy8gU3BhY2VzIGFmdGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEg
bGluZS1icmVhayBnZXQgY29sbGFwc2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFp
bGluZwotICAgICAgICAgICAgLy8gc3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQg
b3V0IGZyb20gdGhlIHJpZ2h0LWhhbmQgZWRnZS4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0
aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWly
ZSByZWJhc2VsaW5pbmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICAgICAgaWYgKG1f
bmV4dE9iamVjdCAmJiBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm9mZnNldCgpICYmIG1fbmV4dE9i
amVjdC0+aXNCUigpICYmIChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9i
bG9ja1N0eWxlLnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpIHsKLSAgICAgICAgICAgICAg
ICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldE9mZnNldChtX3N0YXJ0T2ZJZ25vcmVkU3BhY2Vz
Lm9mZnNldCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IGEgc2lu
Z2xlIHRyYWlsaW5nIHNwYWNlIHN0YXJ0IGlnbm9yaW5nIGl0IG5vdyBzbyBpdCBjb2xsYXBzZXMg
YXdheS4KLSAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50Lm9mZnNldCgpID09IHJlbmRlclRl
eHQudGV4dExlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRT
dGF0ZS5zdGFydElnbm9yaW5nU3BhY2VzKG1fc3RhcnRPZklnbm9yZWRTcGFjZXMpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1dT
ICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgewotICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAg
JiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpKQotICAgICAgICAg
ICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50
Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2UgJiYgIW1faWdub3JpbmdTcGFjZXMpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2Jq
ZWN0cy5zZXRUcmFpbGluZ1doaXRlc3BhY2UoZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9jdXJyZW50
LnJlbmRlcmVyKCkpKTsKLSAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5jb2xsYXBz
ZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAg
IG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0KLSAgICAgICAgbV9hdFN0YXJ0ID0gZmFsc2U7
Ci0gICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hh
cmFjdGVyKTsKLSAgICB9Ci0KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0
b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7
Ci0KLSAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAx
KTsKLSAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVu
dHMubGFzdCgpOwotICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0Owot
Ci0gICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAg
ZmxvYXQgYWRkaXRpb25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdp
ZHRoKCZyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFj
ZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNl
V2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwot
ICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKLSAgICB3b3JkTWVh
c3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOwotICAgIHdvcmRNZWFzdXJl
bWVudC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCAr
IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgIGFkZGl0aW9uYWxUZW1wV2lkdGgg
Kz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0KLSAgICBmbG9hdCBpbmxpbmVMb2dpY2FsVGVtcFdp
ZHRoID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5kZXJlcigpLCAhbV9hcHBsaWVk
U3RhcnRXaWR0aCwgbV9pbmNsdWRlRW5kV2lkdGgpOwotICAgIG1fd2lkdGguYWRkVW5jb21taXR0
ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoICsgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0K
LSAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxs
YmFja0ZvbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9u
dHMuc3dhcChmYWxsYmFja0ZvbnRzKTsKLSAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0KLSAg
ICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAm
JiBhZGRpdGlvbmFsVGVtcFdpZHRoKQotICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgsIGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOwot
Ci0gICAgbV9pbmNsdWRlRW5kV2lkdGggPSBmYWxzZTsKLQotICAgIGlmICghbV93aWR0aC5maXRz
T25MaW5lKCkpIHsKLSAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSkKLSAgICAgICAgICAgIHRyeUh5
cGhlbmF0aW5nKCZyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5
bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIo
KSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3VycmVudFdpZHRoKCkg
LSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQ
aXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVC
cmVhaywgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVCcmVha2VyLm1f
aHlwaGVuYXRlZCk7Ci0KLSAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGluZUJyZWFrLnBy
ZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5
cGhlbnNOb25lKSB7Ci0gICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLSAgICAgICAgICAg
IG1fYXRFbmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotaW5saW5lIGJvb2wgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihSZW5kZXJUZXh0
JiBuZXh0VGV4dCkKLXsKLSAgICBVQ2hhciBjID0gbmV4dFRleHQuY2hhcmFjdGVyQXQoMCk7Ci0g
ICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoYyA9PSAnXG4nICYmICFuZXh0VGV4
dC5wcmVzZXJ2ZXNOZXdsaW5lKCkpOwotfQotCi1pbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6
OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQotewotICAgIC8vIElmIHdlIGFyZSBuby13cmFwIGFu
ZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5IHRoZW4gd2Ug
c2hvdWxkIHRha2UgaXQuCi0gICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiAhbV93
aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1fY3VycldTID09
IE5PV1JBUCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBBdm9pZCBicmVha2luZyBv
biBlbXB0eSBpbmxpbmVzLgotICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVu
ZGVyZXIoKSkgJiYgaXNFbXB0eUlubGluZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX2N1cnJl
bnQucmVuZGVyZXIoKSkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBBdm9pZCBi
cmVha2luZyBiZWZvcmUgZW1wdHkgaW5saW5lcyAoYXMgbG9uZyBhcyB0aGUgY3VycmVudCBvYmpl
Y3QgaXNuJ3QgcmVwbGFjZWQpLgotICAgIGlmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUmVw
bGFjZWQoKSAmJiBpczxSZW5kZXJJbmxpbmU+KG1fbmV4dE9iamVjdCkgJiYgaXNFbXB0eUlubGlu
ZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX25leHRPYmplY3QpKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gUmV0dXJuIGVhcmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3Vy
cmVudCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBhcyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFr
IGF0IHN1Y2ggYSBwb3NpdGlvbi4KLSAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX25leHRPYmpl
Y3QgJiYgbV9uZXh0T2JqZWN0LT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpCi0gICAgICAgIHJl
dHVybiBtX2F1dG9XcmFwOwotCi0gICAgYm9vbCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gaXM8
UmVuZGVyVGV4dD4obV9uZXh0T2JqZWN0KSAmJiAobV9hdXRvV3JhcCB8fCBtX25leHRPYmplY3Qt
PnN0eWxlKCkuYXV0b1dyYXAoKSk7Ci0gICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQot
ICAgICAgICByZXR1cm4gbV9hdXRvV3JhcDsKLSAgICBSZW5kZXJUZXh0JiBuZXh0UmVuZGVyVGV4
dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KCptX25leHRPYmplY3QpOwotICAgIGJvb2wgY3VycmVu
dElzVGV4dE9yRW1wdHlJbmxpbmUgPSBpczxSZW5kZXJUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVy
KCkpIHx8IChpczxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgaXNFbXB0
eUlubGluZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpKTsK
LSAgICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQotICAgICAgICByZXR1cm4gbV9h
dXRvV3JhcCAmJiAhbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUnVieVJ1bigpOwotCi0gICAgYm9v
bCBjYW5CcmVha0hlcmUgPSAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiB0ZXh0QmVnaW5z
V2l0aEJyZWFrYWJsZVBvc2l0aW9uKG5leHRSZW5kZXJUZXh0KTsKLQotICAgIC8vIFNlZSBpZiBh
dHRlbXB0aW5nIHRvIGZpdCBiZWxvdyBmbG9hdHMgY3JlYXRlcyBtb3JlIGF2YWlsYWJsZSB3aWR0
aCBvbiB0aGUgbGluZS4KLSAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRo
LmNvbW1pdHRlZFdpZHRoKCkpCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMobV9saW5l
SW5mby5pc0ZpcnN0TGluZSgpKTsKLQotICAgIGJvb2wgY2FuUGxhY2VPbkxpbmUgPSBtX3dpZHRo
LmZpdHNPbkxpbmUoKSB8fCAhbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lOwotCi0gICAgaWYg
KGNhblBsYWNlT25MaW5lICYmIGNhbkJyZWFrSGVyZSkKLSAgICAgICAgY29tbWl0TGluZUJyZWFr
QXRDdXJyZW50V2lkdGgobmV4dFJlbmRlclRleHQpOwotCi0gICAgcmV0dXJuIGNhbkJyZWFrSGVy
ZTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5l
QnJlYWtJZk5lZWRlZCgpCi17Ci0gICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRo
aXNQb3NpdGlvbigpOwotCi0gICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09u
TGluZShtX2lnbm9yaW5nU3BhY2VzKSkgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywg
dHJ5IHRvIGdldCBiZWxvdyB0aGVtLgotICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0
ZVNwYWNlKCkpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotCi0gICAg
ICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAgICAgICAgIG1fYXRFbmQg
PSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbV93aWR0
aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOwotCi0gICAgICAgIC8v
IHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3RlZCBiZWNhdXNlIHdlIGdvdCBzaG92ZWQgZG93
biBwYXN0IGEgZmxvYXQgKHRodXMKLSAgICAgICAgLy8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNv
IHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRvCi0gICAgICAgIC8vIHRoZSBlbmQg
bGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9uIHRoZSBsaW5lLiAtZHdoCi0gICAgICAgIGlm
ICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFjZXMpKSB7Ci0gICAgICAgICAgICBt
X2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxz
ZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkgJiYgIW1fd2lkdGguZml0c09uTGluZSgpICYm
ICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5l
ciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNoaWxkIGRvZXMgbm90IHRoZW4gd2Ugc3RpbGwg
bmVlZCB0byBlbnN1cmUgdGhhdCBpdAotICAgICAgICAvLyB3cmFwcyBhbmQgbW92ZXMgYmVsb3cg
YW55IGZsb2F0cy4KLSAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlz
Rmlyc3RMaW5lKCkpOwotICAgIH0KLQotICAgIGlmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlz
RmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgewotICAgICAgICBtX2xhc3RPYmplY3Qg
PSBtX2N1cnJlbnQucmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBs
YWNlZCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fbGFzdE9iamVjdC0+aXNSdWJ5UnVuKCkgJiYgKCFt
X2xhc3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFpczxS
ZW5kZXJMaXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KSB8fCBkb3duY2FzdDxSZW5kZXJMaXN0TWFy
a2VyPigqbV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkgewotICAgICAgICAgICAgY29tbWl0TGlu
ZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fbmV4dE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19
Ci0KLWlubGluZSBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZU9yTm90IGNoZWNr
TWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRl
cmF0b3ImIGxCcmVhaykKLXsKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIGxhc3QgbWlkcG9p
bnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQgdGhlIGxpbmUgYnJlYWsuIElmIHNvLAotICAgIC8v
IHNoYXZlIGl0IG9mZiB0aGUgbGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlm
IHRoZSBwcmV2aW91cyBlbmQgcG9pbnQgZG9lc24ndAotICAgIC8vIHByZXNlcnZlIHdoaXRlc3Bh
Y2UuCi0gICAgaWYgKGxCcmVhay5yZW5kZXJlcigpICYmIGxpbmVNaWRwb2ludFN0YXRlLm51bU1p
ZHBvaW50cygpICYmICEobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgJSAyKSkgewot
ICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlk
cG9pbnRzKCkuZGF0YSgpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciYgZW5kcG9pbnQgPSBtaWRw
b2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgLSAyXTsKLSAgICAgICAgY29u
c3QgSW5saW5lSXRlcmF0b3ImIHN0YXJ0cG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzKCkgLSAxXTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgY3VycnBvaW50
ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkgJiYgY3VycnBv
aW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKLSAgICAgICAgICAgIGN1
cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBsQnJlYWspIHsK
LSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBv
aW50LiBTaGF2ZSBvZmYgdGhlIHN0YXJ0IHBvaW50LgotICAgICAgICAgICAgbGluZU1pZHBvaW50
U3RhdGUuZGVjcmVhc2VOdW1NaWRwb2ludHMoKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludC5y
ZW5kZXJlcigpLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZHBvaW50LnJlbmRl
cmVyKCktPmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnQuZmFzdERlY3JlbWVu
dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUcmFpbGluZ09iamVjdHM6OkRvTm90Q29sbGFw
c2VGaXJzdFNwYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVy
biBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZTsKLX0KLQotaW5saW5lIElubGlu
ZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKLXsKLSAgICBpZiAo
bV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7Ci0gICAgICAgIGlmICghbV9s
aW5lQnJlYWsucmVuZGVyZXIoKSB8fCAhbV9saW5lQnJlYWsucmVuZGVyZXIoKS0+aXNCUigpKSB7
Ci0gICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgICAg
ICAgICBpZiAobV9ibG9ja1N0eWxlLndoaXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1fY3VycmVudC5v
ZmZzZXQoKSkKLSAgICAgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgq
bV9sYXN0T2JqZWN0LCBtX2xhc3RPYmplY3QtPmlzVGV4dCgpID8gbV9sYXN0T2JqZWN0LT5sZW5n
dGgoKSA6IDApOwotICAgICAgICAgICAgZWxzZSBpZiAobV9saW5lQnJlYWsucmVuZGVyZXIoKSkg
ewotICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiBh
IHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBy
b29tIGF0IGFsbC4gV2UganVzdCBoYXZlIHRvIGJlIG9uIHRoaXMgbGluZSwKLSAgICAgICAgICAg
ICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCi0gICAgICAgICAgICAgICAgY29t
bWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJl
bnQub2Zmc2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1ha2Ug
c3VyZSB3ZSBjb25zdW1lIGF0IGxlYXN0IG9uZSBjaGFyL29iamVjdC4KLSAgICAgICAgaWYgKG1f
bGluZUJyZWFrID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKLSAgICAgICAgICAgIG1fbGluZUJy
ZWFrLmluY3JlbWVudCgpOwotICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5vZmZzZXQoKSAmJiAh
bV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYm
ICFtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50KSB7Ci0gICAgICAgIC8vIERvIG5v
dCBwdXNoIHRoZSBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV4dCBsaW5lLCB3aGVuIHRoaXMgbGlu
ZSBoYXMgc29tZSBjb250ZW50LCBidXQgaXQgaXMgc3RpbGwgY29uc2lkZXJlZCBlbXB0eS4KLSAg
ICAgICAgLy8gRW1wdHkgaW5saW5lIGVsZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJv
ZHVjZSBzdWNoIGxpbmVzIGFuZCBub3cgd2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0
dW5pdGllcwotICAgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBpZiBubyB3aWR0aCBo
YXMgYmVlbiBjb21taXR0ZWQgeWV0LgotICAgICAgICAvLyBCZWhhdmUgYXMgaWYgaXQgd2FzIGFj
dHVhbGx5IGVtcHR5IGFuZCBjb25zdW1lIGF0IGxlYXN0IG9uZSBvYmplY3QuCi0gICAgICAgIG1f
bGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgIH0KLQotICAgIC8vIFNhbml0eSBjaGVjayBvdXIg
bWlkcG9pbnRzLgotICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3Qg
Y29sbGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJl
YWspOwotCi0gICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdC
b3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgY29sbGFwc2VkKTsKLQotICAg
IC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMg
cGFzdCB0aGUgZW5kCi0gICAgLy8gb2YgdGhlIG9iamVjdC4gRG8gdGhpcyBhZGp1c3RtZW50IHRv
IG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0Ci0gICAgLy8gb2YgdGhlIG5leHQgb2JqZWN0IGlu
c3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9mIHRoZQotICAgIC8vIGNvZGUuCi0g
ICAgaWYgKG1fbGluZUJyZWFrLm9mZnNldCgpKSB7Ci0gICAgICAgIG1fbGluZUJyZWFrLnNldE9m
ZnNldChtX2xpbmVCcmVhay5vZmZzZXQoKSAtIDEpOwotICAgICAgICBtX2xpbmVCcmVhay5pbmNy
ZW1lbnQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9saW5lQnJlYWs7Ci19Ci0KLX0KLQotI2Vu
ZGlmIC8vIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwCmluZGV4IDliMmIzMDZhYmVmMDNhZDkwZDVi
NWYwMjgzMzUwNzU4OGJmNzNjZDkuLjZlMzNjZDMxMDlmNTFjOTM3YzE2YTRhMjc0M2Y1ZmI5Y2Fl
OWFkOTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVh
a2VyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5j
cHAKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJMaW5l
QnJlYWtlci5oIgogCi0jaW5jbHVkZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgor
I2luY2x1ZGUgIkJyZWFraW5nQ29udGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCBjNDQ3M2JjYmFhZWRiZjU0NjgzYTJk
NTUyYjMyNzY2MDljYTE3ZTdkLi5hN2JiODg1MzM4ZGMyNjFhZjU1MzE1OTY3YWVlNDJlY2IxYzhk
YTU1IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTUtMDMtMDMgIE15bGVzIEMuIE1heGZpZWxk
ICA8bW1heGZpZWxkQGFwcGxlLmNvbT4KKworICAgICAgICBJbXBsZW1lbnQgLWFwcGxlLXRyYWls
aW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MjI1MworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhw
ZWN0ZWQuaHRtbDogQWRkZWQuCisgICAgICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRt
bDogQWRkZWQuCisKIDIwMTUtMDMtMDMgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5j
b20+CiAKICAgICAgICAgW1dpbl0gRG9jdW1lbnQgbW9yZSBkZWJ1ZyBhc3NlcnRpb25zLgpkaWZm
IC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRt
bCBiL0xheW91dFRlc3RzL2Zhc3QvdGV4dC90cmFpbGluZy13b3JkLWV4cGVjdGVkLmh0bWwKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uZjYwMjRhZGI1NzNiZjc5YjAyYWY0NjFlYmY3NjhlNGE4YzQxYWEzZQotLS0gL2Rl
di9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvdGV4dC90cmFpbGluZy13b3JkLWV4cGVjdGVk
Lmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgor
PC9oZWFkPgorPGJvZHk+CitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IC1hcHBsZS10cmFpbGlu
Zy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkIGJyZWFrcyBsaW5lcyBjb3JyZWN0bHku
Cis8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogQWhlbTsiPgorPGRpdj5BQkMgREVGIEdISSBKS0wg
TU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHSEkgSktMPGJyPk1OTzwvZGl2PgorPGRpdj5BQkMg
REVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHSEk8YnI+SktMIE1OTzwvZGl2
PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHIEg8YnI+
SSBKIEs8L2Rpdj4KKzxkaXY+QUJDIERFRiBHSEkgSktMIE1OTyBQUVJTIFRVVlcgWFlaIEFCQyBE
RUYgR0hJIEpLTDxicj5NTk8gUFFSUzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBR
UlMgVFVWVyBYWVogQUJDIERFRiBHSEkgSktMPGJyPk1OTyBQUVJTIFRVViBXWFlaIEFCQyBERUYg
R0hJIEpLTCBNTk8gUFFSUyBUVVY8YnI+V1hZWjwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0
bWw+CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC5odG1s
IGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5l
MDgyNGU1NGU1ZGFiZjBmOTJmODhlNmJmYjNhM2Q1MGM5MDlkODM4Ci0tLSAvZGV2L251bGwKKysr
IGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbApAQCAtMCwwICsxLDE1
IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8L2hlYWQ+Cis8Ym9keT4KK1Ro
aXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0
aWFsbHktYmFsYW5jZWQgYnJlYWtzIGxpbmVzIGNvcnJlY3RseS4KKzxkaXYgc3R5bGU9ImZvbnQt
ZmFtaWx5OiBBaGVtOyI+Cis8ZGl2PkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBB
QkMgREVGIEdISSBKS0wgTU5PPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29y
ZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBU
VVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJh
aWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBN
Tk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEcgSCBJIEogSzwvZGl2PgorPGRpdiBzdHlsZT0iLWFw
cGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQ7Ij5BQkMgREVGIEdI
SSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHSEkgSktMIE1OTyBQUVJTPC9kaXY+Cis8
ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNl
ZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5P
IFBRUlMgVFVWIFdYWVogQUJDIERFRiBHSEkgSktMIE1OTyBQUVJTIFRVViBXWFlaPC9kaXY+Cis8
L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247831</attachid>
            <date>2015-03-03 20:47:50 -0800</date>
            <delta_ts>2015-03-03 20:49:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142253-20150303204732.patch</filename>
            <type>text/plain</type>
            <size>46854</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgwOTQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMWE2NGNiOGE5NzFjZjA4
MTFlOGI5NzI2NmZkNmNhOTIxODg4ZWQ0Mi4uNTg3Y2I0MTkwYzAxMjBiMzMwZWVkYTRjZDc2ZmE3
YmVlZDc2NTA4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDcwIEBACiAyMDE1LTAzLTAzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKKyAgICAgICAgSW1wbGVtZW50
IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDIyNTMKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGltcGxl
bWVudHMgYSBoaXN0b3J5IG1lY2hhbmlzbSBmb3IgbGluZSBicmVha2luZy4gSW4gcGFydGljdWxh
ciwgdGhpcyBwYXRjaCBwYXJ0aXRpb25zCisgICAgICAgIHRoZSB1cGRhdGVzIHRvIHRoZSBjdXJy
ZW50IGxpbmUgYnJlYWtpbmcgbG9jYXRpb24gaW50byB0d28ga2luZHM6IGNvbmNlcHR1YWxseSBu
ZXcgYnJlYWtpbmcgbG9jYXRpb25zLAorICAgICAgICBhbmQgZml4dXBzIHRvIGV4aXN0aW5nIGxv
Y2F0aW9ucy4gVGhlbiwgdGhpcyBwYXRjaCByZW1lbWJlcnMgYWxsIHRoZSBmaXhlZCB1cCBicmVh
a2luZyBsb2NhdGlvbnMsIHVwCisgICAgICAgIHRvIGEgbWF4aW11bSBudW1iZXIgb2YgcmVtZW1i
ZXJlZCBsb2NhdGlvbnMuCisKKyAgICAgICAgVGhlIHBhdGNoIHRoZW4gdXNlcyB0aGlzIG1lbW9y
eSB0byBjaGFuZ2UgdGhlIGxpbmUtYnJlYWtpbmcgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBydWxl
cyBvZgorICAgICAgICAtYXBwbGUtdHJhaWxpbmctd29yZC4KKworICAgICAgICBUaGlzIHBhdGNo
IGFsc28gcGVyZm9ybXMgc29tZSBjbGVhbnVwIG9mIEJyZWFraW5nQ29udGV4dCwgdXNpbmcgbnVs
bHB0ciBpbnN0ZWFkIG9mIDAgYW5kIG1pZ3JhdGluZworICAgICAgICBub24tbnVsbCBwb2ludGVy
cyB0byByZWZlcmVuY2VzLgorCisgICAgICAgIFRlc3Q6IGZhc3QvdGV4dC90cmFpbGluZy13b3Jk
Lmh0bWwKKworICAgICAgICAqIHJlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oOiBVc2UgbnVsbHB0
ciBpbnN0ZWFkIG9mIDAKKyAgICAgICAgKFdlYkNvcmU6OklubGluZUl0ZXJhdG9yOjpJbmxpbmVJ
dGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVJdGVyYXRvcjo6Y2xlYXIpOgorICAg
ICAgICAoV2ViQ29yZTo6YmlkaU5leHRTaGFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6YmlkaU5l
eHRTa2lwcGluZ0VtcHR5SW5saW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpiaWRpTmV4dEluY2x1
ZGluZ0VtcHR5SW5saW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVXYWxrZXI6OklubGlu
ZVdhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KToK
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDogVXNlIHJlZmVy
ZW5jZXMgaW5zdGVhZCBvZiBwb2ludGVycworICAgICAgICAoV2ViQ29yZTo6c2V0TG9naWNhbFdp
ZHRoRm9yVGV4dFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1
dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAgICAgKiByZW5kZXJp
bmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg6CisgICAgICAgIFVzZSBJbmxp
bmVJdGVyYXRvckhpc3RvcnkgYXMgYSBwcm94eSBmb3IgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9j
YXRpb24uIE5vdGUgdGhhdCBhbGwgdGhlc2UgZnVuY3Rpb25zCisgICAgICAgIGFyZSBpbmxpbmVk
LCBzbyB0aGUgb3ZlcmhlYWQgc2hvdWxkIGJlIG5leHQgdG8gbm90aGluZyB3aGVuIC1hcHBsZS10
cmFpbGluZy13b3JkIGlzIG5vdCBpbiB1c2UuCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0Nv
bnRleHQ6OkJyZWFraW5nQ29udGV4dCk6IFVzZSBJbmxpbmVJdGVyYXRvckhpc3RvcnkgaW5zdGVh
ZCBvZiBJbmxpbmVJdGVyYXRvcgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojps
aW5lQnJlYWspOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y2xl
YXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOiBEaXR0bworICAgICAgICAoV2ViQ29yZTo6QnJlYWtp
bmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6IERpdHRvCisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5KTogS2VlcHMgdHJhY2sgb2YgaGlzdG9yaWNhbAorICAgICAgICBicmVh
a2luZyBsb2NhdGlvbnMKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5OjpwdXNoKTogUmVtZW1iZXIgYSBuZXcgYnJlYWtpbmcgbG9jYXRpb24K
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5
Ojp1cGRhdGUpOiBVcGRhdGUgYW4gZXhpc3RpbmcgYnJlYWtpbmcgbG9jYXRpb24KKyAgICAgICAg
KFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpyZW5kZXJl
cik6IEZvcndhcmRlZCB0byB0aGUgY3VycmVudCBicmVha2luZyBsb2NhdGlvbgorICAgICAgICAo
V2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Om9mZnNldCk6
IERpdHRvCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9y
SGlzdG9yeTo6YXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKTogIERpdHRvCisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6cHJldmlvdXNJblNh
bWVOb2RlKTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5OjpnZXQpOiBHZXQgb25lIG9mIHRoZSByZW1lbWJlcmVkIGJyZWFraW5n
IGxvY2F0aW9ucworICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVy
YXRvckhpc3Rvcnk6OmN1cnJlbnQpOiBHZXQgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9jYXRpb24K
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5
OjpoaXN0b3J5TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5s
aW5lSXRlcmF0b3JIaXN0b3J5Ojptb3ZlVG8pOiBGb3J3YXJkZWQgdG8gdGhlIGN1cnJlbnQgYnJl
YWtpZ24gbG9jYXRpb24uCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGlu
ZUl0ZXJhdG9ySGlzdG9yeTo6aW5jcmVtZW50KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpjbGVhcik6IERpdHRvCisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUJSKTogVXNlIElubGluZUl0ZXJh
dG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6Om1l
YXN1cmVIeXBoZW5XaWR0aCk6IFVzZSByZWZlcmVuY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMKKyAg
ICAgICAgKFdlYkNvcmU6OnRleHRXaWR0aCk6IERpdHRvCisgICAgICAgIChXZWJDb3JlOjp0cnlI
eXBoZW5hdGluZyk6IERpdHRvCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZVRleHQpOiBVc2UgcmVmZXJlbmNlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzLCBhbmQgdXNlCisg
ICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVh
a0lmTmVlZGVkKTogU3R5bGUKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrTWlkcG9pbnRzKTogVXNl
IElubGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSk6IElmIC1hcHBsZS10
cmFpbGluZy13b3JkIGlzIGluIGVmZmVjdCwgbG9vayBiYWNrIHRocm91Z2gKKyAgICAgICAgdGhl
IHJlbWVtYmVyZWQgYnJlYWtpbmcgbG9jYXRpb25zIGFuZCBjaG9vc2UgdGhlIG9wdGltYWwgb25l
LgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpsaW5lQnJlYWtSZWYpOiBEZWxl
dGVkLgorCisyMDE1LTAzLTAzICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5j
b20+CisKICAgICAgICAgQnJlYWtpbmdDb250ZXh0IGNsZWFudXAKICAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MjE0NgogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCmluZGV4IDdhNzZhYjk4NzA1ZjhmYjdkYTJkMGEyYzk2
Mjg0NDhkNTljNGE1MjYuLmE5ZWZlMGQwNmRhMjRjYjczMDAwYzU4NDdlODlmY2ZmZjg4ZmUzYzEg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCkBAIC0zNyw4ICsz
Nyw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIElubGluZUl0ZXJhdG9yIHsKIHB1Ymxp
YzoKICAgICBJbmxpbmVJdGVyYXRvcigpCi0gICAgICAgIDogbV9yb290KDApCi0gICAgICAgICwg
bV9yZW5kZXJlcigwKQorICAgICAgICA6IG1fcm9vdChudWxscHRyKQorICAgICAgICAsIG1fcmVu
ZGVyZXIobnVsbHB0cikKICAgICAgICAgLCBtX25leHRCcmVha2FibGVQb3NpdGlvbigtMSkKICAg
ICAgICAgLCBtX3BvcygwKQogICAgICAgICAsIG1fcmVmZXJzVG9FbmRPZlByZXZpb3VzTm9kZShm
YWxzZSkKQEAgLTU0LDcgKzU0LDcgQEAgcHVibGljOgogICAgIHsKICAgICB9CiAKLSAgICB2b2lk
IGNsZWFyKCkgeyBtb3ZlVG8oMCwgMCk7IH0KKyAgICB2b2lkIGNsZWFyKCkgeyBtb3ZlVG8obnVs
bHB0ciwgMCk7IH0KIAogICAgIHZvaWQgbW92ZVRvU3RhcnRPZihSZW5kZXJPYmplY3QqIG9iamVj
dCkKICAgICB7CkBAIC03OSw3ICs3OSw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFJlZmVyc1Rv
RW5kT2ZQcmV2aW91c05vZGUoKTsKIAogICAgIHZvaWQgZmFzdEluY3JlbWVudEluVGV4dE5vZGUo
KTsKLSAgICB2b2lkIGluY3JlbWVudChJbmxpbmVCaWRpUmVzb2x2ZXIqID0gMCk7CisgICAgdm9p
ZCBpbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiA9IG51bGxwdHIpOwogICAgIHZvaWQgZmFz
dERlY3JlbWVudCgpOwogICAgIGJvb2wgYXRFbmQoKSBjb25zdDsKIApAQCAtMjEyLDcgKzIxMiw3
IEBAIHN0YXRpYyBib29sIGlzRW1wdHlJbmxpbmUoY29uc3QgUmVuZGVySW5saW5lJiByZW5kZXJl
cikKIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBpdGVyYXRlIG92ZXIgaW5saW5lcyB3aXRoaW4gYSBi
bG9jaywgb3B0aW9uYWxseSBub3RpZnlpbmcKIC8vIGEgYmlkaSByZXNvbHZlciBhcyBpdCBlbnRl
cnMvZXhpdHMgaW5saW5lcyAoc28gaXQgY2FuIHB1c2gvcG9wIGVtYmVkZGluZyBsZXZlbHMpLgog
dGVtcGxhdGUgPGNsYXNzIE9ic2VydmVyPgotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJp
ZGlOZXh0U2hhcmVkKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlbmRlck9iamVjdCogY3VycmVudCwg
T2JzZXJ2ZXIqIG9ic2VydmVyID0gMCwgRW1wdHlJbmxpbmVCZWhhdmlvciBlbXB0eUlubGluZUJl
aGF2aW9yID0gU2tpcEVtcHR5SW5saW5lcywgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAwKQorc3Rh
dGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0U2hhcmVkKFJlbmRlckVsZW1lbnQmIHJv
b3QsIFJlbmRlck9iamVjdCogY3VycmVudCwgT2JzZXJ2ZXIqIG9ic2VydmVyID0gbnVsbHB0ciwg
RW1wdHlJbmxpbmVCZWhhdmlvciBlbXB0eUlubGluZUJlaGF2aW9yID0gU2tpcEVtcHR5SW5saW5l
cywgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSBudWxscHRyKQogewogICAgIFJlbmRlck9iamVjdCog
bmV4dCA9IG51bGxwdHI7CiAgICAgLy8gb2xkRW5kT2ZJbmxpbmUgZGVub3RlcyBpZiB3aGVuIHdl
IGxhc3Qgc3RvcHBlZCBpdGVyYXRpbmcgaWYgd2Ugd2VyZSBhdCB0aGUgZW5kIG9mIGFuIGlubGlu
ZS4KQEAgLTI3OCwxMyArMjc4LDEzIEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRp
TmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlCiAvLyBUaGlz
IG1ha2VzIGNhbGxlcnMgY2xlYW5lciBhcyB0aGV5IGRvbid0IGhhdmUgdG8gc3BlY2lmeSBhIHR5
cGUgZm9yIHRoZSBvYnNlcnZlciB3aGVuIG5vdCBwcm92aWRpbmcgb25lLgogc3RhdGljIGlubGlu
ZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoUmVuZGVyRWxlbWVu
dCYgcm9vdCwgUmVuZGVyT2JqZWN0KiBjdXJyZW50KQogewotICAgIElubGluZUJpZGlSZXNvbHZl
ciogb2JzZXJ2ZXIgPSAwOworICAgIElubGluZUJpZGlSZXNvbHZlciogb2JzZXJ2ZXIgPSBudWxs
cHRyOwogICAgIHJldHVybiBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKHJvb3QsIGN1cnJl
bnQsIG9ic2VydmVyKTsKIH0KIAotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0
SW5jbHVkaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlbmRlck9iamVjdCog
Y3VycmVudCwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAwKQorc3RhdGljIGlubGluZSBSZW5kZXJP
YmplY3QqIGJpZGlOZXh0SW5jbHVkaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3Qs
IFJlbmRlck9iamVjdCogY3VycmVudCwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSBudWxscHRyKQog
ewotICAgIElubGluZUJpZGlSZXNvbHZlciogb2JzZXJ2ZXIgPSAwOyAvLyBDYWxsZXJzIHdobyBp
bmNsdWRlIGVtcHR5IGlubGluZXMsIG5ldmVyIHVzZSBhbiBvYnNlcnZlci4KKyAgICBJbmxpbmVC
aWRpUmVzb2x2ZXIqIG9ic2VydmVyID0gbnVsbHB0cjsgLy8gQ2FsbGVycyB3aG8gaW5jbHVkZSBl
bXB0eSBpbmxpbmVzLCBuZXZlciB1c2UgYW4gb2JzZXJ2ZXIuCiAgICAgcmV0dXJuIGJpZGlOZXh0
U2hhcmVkKHJvb3QsIGN1cnJlbnQsIG9ic2VydmVyLCBJbmNsdWRlRW1wdHlJbmxpbmVzLCBlbmRP
ZklubGluZVB0cik7CiB9CiAKQEAgLTM1Myw3ICszNTMsNyBAQCBjbGFzcyBJbmxpbmVXYWxrZXIg
ewogcHVibGljOgogICAgIElubGluZVdhbGtlcihSZW5kZXJFbGVtZW50JiByb290KQogICAgICAg
ICA6IG1fcm9vdChyb290KQotICAgICAgICAsIG1fY3VycmVudCgwKQorICAgICAgICAsIG1fY3Vy
cmVudChudWxscHRyKQogICAgICAgICAsIG1fYXRFbmRPZklubGluZShmYWxzZSkKICAgICB7CiAg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGNsYXNzIHNob3VsZCBiZSB0YXVnaHQgaG93IHRvIGRvIHRo
ZSBTa2lwRW1wdHlJbmxpbmVzIGNvZGVwYXRoIGFzIHdlbGwuCkBAIC0zODcsNyArMzg3LDcgQEAg
aW5saW5lIHZvaWQgSW5saW5lSXRlcmF0b3I6OmluY3JlbWVudChJbmxpbmVCaWRpUmVzb2x2ZXIq
IHJlc29sdmVyKQogICAgICAgICBpZiAobV9wb3MgPCBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9y
ZW5kZXJlcikudGV4dExlbmd0aCgpKQogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAv
LyBiaWRpTmV4dCBjYW4gcmV0dXJuIDAsIHNvIHVzZSBtb3ZlVG8gaW5zdGVhZCBvZiBtb3ZlVG9T
dGFydE9mCisgICAgLy8gYmlkaU5leHQgY2FuIHJldHVybiBudWxscHRyLCBzbyB1c2UgbW92ZVRv
IGluc3RlYWQgb2YgbW92ZVRvU3RhcnRPZgogICAgIG1vdmVUbyhiaWRpTmV4dFNraXBwaW5nRW1w
dHlJbmxpbmVzKCptX3Jvb3QsIG1fcmVuZGVyZXIsIHJlc29sdmVyKSwgMCk7CiB9CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKaW5k
ZXggOTlkOWZhM2FmYzFkMzc0Yjg3MWQwODIzMjBmNmVhNzIwNTViZjY0ZC4uYTdhNzg4ODE2ZTBi
ZGJlZWQ0NmNlZWE3Zjk5ZDRhZDc1OGUyMjAzYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKQEAgLTQ1NSwxMyArNDU1LDEzIEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4s
IFJlbmRlclJ1YnlSdW4mIHJlbmRlcmVyCiAgICAgc2V0TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVy
ZXIsIC1lbmRPdmVyaGFuZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lk
dGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVy
VGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKK3N0
YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gq
IGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGZsb2F0IHhQb3Ms
IGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tG
b250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQ
b3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAg
IEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7CiAgICAgR2x5cGhPdmVyZmxvdyBn
bHlwaE92ZXJmbG93OwogCi0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBsaW5lU3R5bGUo
KnJlbmRlcmVyLT5wYXJlbnQoKSwgbGluZUluZm8pLmZvbnRDYXNjYWRlKCk7CisgICAgY29uc3Qg
Rm9udENhc2NhZGUmIGZvbnQgPSBsaW5lU3R5bGUoKnJlbmRlcmVyLnBhcmVudCgpLCBsaW5lSW5m
bykuZm9udENhc2NhZGUoKTsKICAgICAvLyBBbHdheXMgY29tcHV0ZSBnbHlwaCBvdmVyZmxvdyBp
ZiB0aGUgYmxvY2sncyBsaW5lLWJveC1jb250YWluIHZhbHVlIGlzICJnbHlwaHMiLgogICAgIGlm
IChsaW5lQm94LT5maXRzVG9HbHlwaHMoKSkgewogICAgICAgICAvLyBJZiB3ZSBkb24ndCBzdGlj
ayBvdXQgb2YgdGhlIHJvb3QgbGluZSdzIGZvbnQgYm94LCB0aGVuIGRvbid0IGJvdGhlciBjb21w
dXRpbmcgb3VyIGdseXBoIG92ZXJmbG93LiBUaGlzIG9wdGltaXphdGlvbgpAQCAtNDgzLDcgKzQ4
Myw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJ
bmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgZmxvYXQgbWVhc3VyZWRXaWR0aCA9
IDA7CiAKICAgICBib29sIGtlcm5pbmdJc0VuYWJsZWQgPSBmb250LnR5cGVzZXR0aW5nRmVhdHVy
ZXMoKSAmIEtlcm5pbmc7Ci0gICAgYm9vbCBjYW5Vc2VTaW1wbGVGb250Q29kZVBhdGggPSByZW5k
ZXJlci0+Y2FuVXNlU2ltcGxlRm9udENvZGVQYXRoKCk7CisgICAgYm9vbCBjYW5Vc2VTaW1wbGVG
b250Q29kZVBhdGggPSByZW5kZXJlci5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKICAgICAK
ICAgICAvLyBTaW5jZSB3ZSBkb24ndCBjYWNoZSBnbHlwaCBvdmVyZmxvd3MsIHdlIG5lZWQgdG8g
cmUtbWVhc3VyZSB0aGUgcnVuIGlmCiAgICAgLy8gdGhlIHN0eWxlIGlzIGxpbmVib3gtY29udGFp
bjogZ2x5cGguCkBAIC00OTQsMTggKzQ5NCwxOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc2V0TG9n
aWNhbFdpZHRoRm9yVGV4dFJ1bihSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBydQog
ICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3Vy
ZW1lbnRzW2ldOwogICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC53aWR0aCA8PSAwIHx8
IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9PSB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0
KQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudC5yZW5kZXJlciAhPSByZW5kZXJlciB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQg
IT0gbGFzdEVuZE9mZnNldCB8fCB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID4gcnVuLT5tX3N0
b3ApCisgICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LnJlbmRlcmVyICE9ICZyZW5kZXJl
ciB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgIT0gbGFzdEVuZE9mZnNldCB8fCB3b3Jk
TWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID4gcnVuLT5tX3N0b3ApCiAgICAgICAgICAgICAgICAgY29u
dGludWU7CiAKICAgICAgICAgICAgIGxhc3RFbmRPZmZzZXQgPSB3b3JkTWVhc3VyZW1lbnQuZW5k
T2Zmc2V0OwogICAgICAgICAgICAgaWYgKGtlcm5pbmdJc0VuYWJsZWQgJiYgbGFzdEVuZE9mZnNl
dCA9PSBydW4tPm1fc3RvcCkgewogICAgICAgICAgICAgICAgIGludCB3b3JkTGVuZ3RoID0gbGFz
dEVuZE9mZnNldCAtIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldDsKICAgICAgICAgICAgICAg
ICBHbHlwaE92ZXJmbG93IG92ZXJmbG93OwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGgg
Kz0gcmVuZGVyZXItPndpZHRoKHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCwgd29yZExlbmd0
aCwgeFBvcyArIG1lYXN1cmVkV2lkdGgsIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksCisgICAgICAg
ICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSByZW5kZXJlci53aWR0aCh3b3JkTWVhc3VyZW1lbnQu
c3RhcnRPZmZzZXQsIHdvcmRMZW5ndGgsIHhQb3MgKyBtZWFzdXJlZFdpZHRoLCBsaW5lSW5mby5p
c0ZpcnN0TGluZSgpLAogICAgICAgICAgICAgICAgICAgICAmd29yZE1lYXN1cmVtZW50LmZhbGxi
YWNrRm9udHMsICZvdmVyZmxvdyk7Ci0gICAgICAgICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVy
LT5jaGFyYWN0ZXJBdCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQpOworICAgICAgICAgICAg
ICAgIFVDaGFyIGMgPSByZW5kZXJlci5jaGFyYWN0ZXJBdCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRP
ZmZzZXQpOwogICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB3b3JkTGVuZ3RoID09IDEgJiYg
KGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lk
dGggKz0gcmVuZGVyZXItPnN0eWxlKCkuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpOworICAg
ICAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLnN0eWxlKCkuZm9udENh
c2NhZGUoKS53b3JkU3BhY2luZygpOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg
ICAgbWVhc3VyZWRXaWR0aCArPSB3b3JkTWVhc3VyZW1lbnQud2lkdGg7CiAgICAgICAgICAgICBp
ZiAoIXdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkgewpAQCAtNTIyLDcg
KzUyMiw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJv
b3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgfQogCiAgICAgaWYgKCFtZWFz
dXJlZFdpZHRoKQotICAgICAgICBtZWFzdXJlZFdpZHRoID0gcmVuZGVyZXItPndpZHRoKHJ1bi0+
bV9zdGFydCwgcnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZvLmlzRmly
c3RMaW5lKCksICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CisgICAgICAgIG1lYXN1
cmVkV2lkdGggPSByZW5kZXJlci53aWR0aChydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wIC0gcnVu
LT5tX3N0YXJ0LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCAmZmFsbGJhY2tGb250cywg
JmdseXBoT3ZlcmZsb3cpOwogCiAgICAgcnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKG1lYXN1
cmVkV2lkdGggKyBoeXBoZW5XaWR0aCk7CiAgICAgaWYgKCFmYWxsYmFja0ZvbnRzLmlzRW1wdHko
KSkgewpAQCAtNTM0LDcgKzUzNCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lk
dGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgfQog
CiAgICAgLy8gSW5jbHVkZSB0ZXh0IGRlY29yYXRpb24gdmlzdWFsIG92ZXJmbG93IGFzIHBhcnQg
b2YgdGhlIGdseXBoIG92ZXJmbG93LgotICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS50ZXh0RGVj
b3JhdGlvbnNJbkVmZmVjdCgpICE9IFRleHREZWNvcmF0aW9uTm9uZSkKKyAgICBpZiAocmVuZGVy
ZXIuc3R5bGUoKS50ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCgpICE9IFRleHREZWNvcmF0aW9uTm9u
ZSkKICAgICAgICAgZ2x5cGhPdmVyZmxvdy5leHRlbmRUbyh2aXN1YWxPdmVyZmxvd0ZvckRlY29y
YXRpb25zKHJ1bi0+Ym94KCktPmxpbmVTdHlsZSgpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94Pihy
dW4tPmJveCgpKSkpOwogCiAgICAgaWYgKCFnbHlwaE92ZXJmbG93LmlzRW1wdHkoKSkgewpAQCAt
NzQ3LDcgKzc0Nyw3IEBAIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURp
cmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJvCiAgICAgICAgICAgICAgICAg
bmVlZHNXb3JkU3BhY2luZyA9ICFpc1NwYWNlT3JOZXdsaW5lKHJlbmRlclRleHQuY2hhcmFjdGVy
QXQocnVuLT5tX3N0b3AgLSAxKSkgJiYgcnVuLT5tX3N0b3AgPT0gbGVuZ3RoOwogICAgICAgICAg
ICAgfQogCi0gICAgICAgICAgICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHJ1
biwgJnJlbmRlclRleHQsIHRvdGFsTG9naWNhbFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFN
YXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgICAg
ICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHJ1biwgcmVuZGVyVGV4dCwgdG90
YWxMb2dpY2FsV2lkdGgsIGxpbmVJbmZvLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlv
bkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg
IGJvb2wgZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAo
aXM8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSAmJiB0ZXh0QWxpZ24gPT0gSlVTVElG
WSAmJiBydW4gIT0gdHJhaWxpbmdTcGFjZVJ1biAmJiBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihy
dW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkpIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaAppbmRl
eCA3ZDkwZWNlZjcwMzVmMmQ5N2UxNWQ0NjQwY2QyMDgxNTdlMTRmZDEwLi44YmU1ZmQ5NjUxODgy
MzM2OWYxYjA1MWYzMTkyNDI3ZjUxYWRjODI0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCkBA
IC02OCw3ICs2OCw3IEBAIHB1YmxpYzoKICAgICAgICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVh
a2VyKQogICAgICAgICAsIG1fcmVzb2x2ZXIocmVzb2x2ZXIpCiAgICAgICAgICwgbV9jdXJyZW50
KHJlc29sdmVyLnBvc2l0aW9uKCkpCi0gICAgICAgICwgbV9saW5lQnJlYWsocmVzb2x2ZXIucG9z
aXRpb24oKSkKKyAgICAgICAgLCBtX2xpbmVCcmVha0hpc3RvcnkoSW5saW5lSXRlcmF0b3IocmVz
b2x2ZXIucG9zaXRpb24oKSksIGJsb2NrLnN0eWxlKCkudHJhaWxpbmdXb3JkKCkgPT0gVHJhaWxp
bmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNlZCA/IDUgOiAxKQogICAgICAgICAsIG1fYmxvY2soYmxv
Y2spCiAgICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5yZW5kZXJlcigpKQogICAgICAg
ICAsIG1fbmV4dE9iamVjdChudWxscHRyKQpAQCAtMTAxLDggKzEwMSw3IEBAIHB1YmxpYzoKICAg
ICB9CiAKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJl
bnQucmVuZGVyZXIoKTsgfQotICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVhaygpIHsgcmV0dXJu
IG1fbGluZUJyZWFrOyB9Ci0gICAgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVha1JlZigpIHtyZXR1
cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVyYXRvciBsaW5lQnJlYWsoKSB7IHJldHVy
biBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOyB9CiAgICAgTGluZVdpZHRoJiBsaW5lV2lk
dGgoKSB7IHJldHVybiBtX3dpZHRoOyB9CiAgICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJuIG1fYXRF
bmQ7IH0KIApAQCAtMTIzLDIxICsxMjIsODEgQEAgcHVibGljOgogICAgIHZvaWQgY2xlYXJMaW5l
QnJlYWtJZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKICAg
ICB7CiAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNl
KSB8fCBtX2xhc3RXUyA9PSBOT1dSQVApCi0gICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVhcigp
OworICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmNsZWFyKCk7CiAgICAgfQogCiAgICAg
dm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmplY3QmIG9iamVjdCwg
dW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQogICAgIHsKICAgICAgICAg
bV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKCZvYmplY3QsIG9m
ZnNldCwgbmV4dEJyZWFrKTsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbygmb2Jq
ZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7CiAgICAgfQogCiBwcml2YXRlOgorICAgIC8vIFRoaXMg
Y2xhc3Mga2VlcHMgYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgcGFzdCBuIGxvY2F0aW9ucyBmb3Ig
YW4gSW5saW5lSXRlcmF0b3IuCisgICAgY2xhc3MgSW5saW5lSXRlcmF0b3JIaXN0b3J5IDogcHJp
dmF0ZSBWZWN0b3I8SW5saW5lSXRlcmF0b3IsIDE+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIElu
bGluZUl0ZXJhdG9ySGlzdG9yeSgpID0gZGVsZXRlOworICAgICAgICBJbmxpbmVJdGVyYXRvckhp
c3RvcnkoY29uc3QgSW5saW5lSXRlcmF0b3ImIGluaXRpYWwsIHNpemVfdCBjYXBhY2l0eSkKKyAg
ICAgICAgICAgIDogbV9jYXBhY2l0eShjYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAg
QVNTRVJUKGNhcGFjaXR5ID4gMCk7CisgICAgICAgICAgICB0aGlzLT5hcHBlbmQoaW5pdGlhbCk7
CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHB1c2goc3RkOjpmdW5jdGlvbjx2b2lkKElubGlu
ZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFT
U0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9IDEp
CisgICAgICAgICAgICAgICAgdGhpcy0+aW5zZXJ0KDAsIElubGluZUl0ZXJhdG9yKHRoaXMtPmF0
KDApKSk7CisgICAgICAgICAgICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKKyAgICAgICAgICAgIGlm
IChtX2NhcGFjaXR5ICE9IDEpCisgICAgICAgICAgICAgICAgdGhpcy0+cmVzaXplKG1fY2FwYWNp
dHkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGUoc3RkOjpmdW5jdGlvbjx2b2lk
KElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHVwZGF0ZXIodGhpcy0+
YXQoMCkpOworICAgICAgICB9CisKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlcigpIGNv
bnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLnJlbmRlcmVyKCk7IH0KKyAgICAgICAgdW5zaWduZWQg
b2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkub2Zmc2V0KCk7IH0KKyAgICAgICAg
Ym9vbCBhdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgw
KS5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKTsgfQorICAgICAgICBVQ2hhciBwcmV2aW91c0lu
U2FtZU5vZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5wcmV2aW91c0luU2FtZU5vZGUo
KTsgfQorICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgZ2V0KHNpemVfdCBpKSBjb25zdCB7
IHJldHVybiB0aGlzLT5hdChpKTsgfTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIGN1
cnJlbnQoKSBjb25zdCB7IHJldHVybiBnZXQoMCk7IH0KKyAgICAgICAgc2l6ZV90IGhpc3RvcnlM
ZW5ndGgoKSBjb25zdCB7IHJldHVybiB0aGlzLT5zaXplKCk7IH0KKworICAgICAgICB2b2lkIG1v
dmVUbyhSZW5kZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgbmV4dEJyZWFr
ID0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBt
b2RpZnlNZSkgeworICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhvYmplY3QsIG9mZnNl
dCwgbmV4dEJyZWFrKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdm9p
ZCBpbmNyZW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUoW10oSW5saW5lSXRl
cmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7
CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAg
ICAgICB7CisgICAgICAgICAgICBwdXNoKFtdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewor
ICAgICAgICAgICAgICAgIG1vZGlmeU1lLmNsZWFyKCk7CisgICAgICAgICAgICB9KTsKKyAgICAg
ICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1fY2FwYWNpdHk7Cisg
ICAgfTsKKwogICAgIExpbmVCcmVha2VyJiBtX2xpbmVCcmVha2VyOwogICAgIElubGluZUJpZGlS
ZXNvbHZlciYgbV9yZXNvbHZlcjsKIAogICAgIElubGluZUl0ZXJhdG9yIG1fY3VycmVudDsKLSAg
ICBJbmxpbmVJdGVyYXRvciBtX2xpbmVCcmVhazsKKyAgICBJbmxpbmVJdGVyYXRvckhpc3Rvcnkg
bV9saW5lQnJlYWtIaXN0b3J5OwogICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRT
cGFjZXM7CiAKICAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CkBAIC0yMjgsOCArMjg3LDEw
IEBAIGlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikK
IHsKICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkpIHsKICAgICAgICAgUmVuZGVyT2JqZWN0
KiBiciA9IG1fY3VycmVudC5yZW5kZXJlcigpOwotICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9T
dGFydE9mKGJyKTsKLSAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgIG1f
bGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAg
ICAgICAgICAgIG1vZGlmeU1lLm1vdmVUb1N0YXJ0T2YoYnIpOworICAgICAgICAgICAgbW9kaWZ5
TWUuaW5jcmVtZW50KCk7CisgICAgICAgIH0pOwogCiAgICAgICAgIC8vIEEgPGJyPiBhbHdheXMg
YnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAogICAgICAg
ICAvLyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxi
cj4gZG9lcyBub3QKQEAgLTM1MCw5ICs0MTEsOSBAQCBpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRl
eHQ6OmhhbmRsZUZsb2F0KCkKICAgICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8gbmV4dCBsaW5lIChp
biBjbGVhckZsb2F0cygpIGZ1bmMpCiAgICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYmIG1fd2lk
dGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2ljYWxX
aWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKICAgICAgICAgbV9saW5lQnJlYWtlci5w
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOwotICAgICAgICBpZiAobV9saW5lQnJlYWsu
cmVuZGVyZXIoKSA9PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgewotICAgICAgICAgICAgQVNTRVJU
KCFtX2xpbmVCcmVhay5vZmZzZXQoKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1l
bnQoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpID09IG1fY3Vy
cmVudC5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJyZWFrSGlzdG9y
eS5vZmZzZXQoKSk7CisgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7
CiAgICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgbV9mbG9hdHNGaXRPbkxpbmUgPSBmYWxz
ZTsKQEAgLTQ4OSwyOCArNTUwLDI4IEBAIGlubGluZSB2b2lkIHVwZGF0ZUNvdW50ZXJJZk5lZWRl
ZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQogICAgIGRvd25jYXN0PFJlbmRlckNvdW50ZXI+KHJl
bmRlclRleHQpLnVwZGF0ZUNvdW50ZXIoKTsKIH0KIAotaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBo
ZW5XaWR0aChSZW5kZXJUZXh0KiByZW5kZXJlciwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIEhh
c2hTZXQ8Y29uc3QgRm9udCo+KiBmYWxsYmFja0ZvbnRzID0gMCkKK2lubGluZSBmbG9hdCBtZWFz
dXJlSHlwaGVuV2lkdGgoUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGNvbnN0IEZvbnRDYXNjYWRlJiBm
b250LCBIYXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cyA9IDApCiB7Ci0gICAgY29u
c3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZv
bnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0
eWxlLmh5cGhlblN0cmluZygpLnN0cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOworICAg
IGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRlcmVyLnN0eWxlKCk7CisgICAgcmV0dXJu
IGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnJlbmRlcmVyLCBmb250
LCBzdHlsZS5oeXBoZW5TdHJpbmcoKS5zdHJpbmcoKSwgc3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsK
IH0KIAotQUxXQVlTX0lOTElORSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5z
aWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgZmxvYXQg
eFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNoU2V0
PGNvbnN0IEZvbnQqPiYgZmFsbGJhY2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gMCkKK0FM
V0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQmIHRleHQsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGZsb2F0IHhQb3MsIGJv
b2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxjb25zdCBG
b250Kj4mIGZhbGxiYWNrRm9udHMsIFRleHRMYXlvdXQqIGxheW91dCA9IG51bGxwdHIpCiB7Ci0g
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKyAgICBjb25zdCBS
ZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LnN0eWxlKCk7CiAKICAgICBHbHlwaE92ZXJmbG93IGds
eXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09IHRl
eHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENvbWJpbmUoKSkKLSAgICAgICAgcmV0
dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9udHMsICZn
bHlwaE92ZXJmbG93KTsKKyAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0g
dGV4dC50ZXh0TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkpCisgICAgICAgIHJl
dHVybiB0ZXh0LndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9udHMsICZn
bHlwaE92ZXJmbG93KTsKIAogICAgIGlmIChsYXlvdXQpCiAgICAgICAgIHJldHVybiBGb250Q2Fz
Y2FkZTo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7CiAKLSAgICBU
ZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRl
eHQsIGZyb20sIGxlbiwgc3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQt
PnRleHRMZW5ndGgoKSAtIGZyb20pOworICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdFRleHRSdW4oJnRleHQsIGZvbnQsICZ0ZXh0LCBmcm9tLCBsZW4sIHN0eWxlKTsKKyAg
ICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LnRleHRMZW5ndGgoKSAtIGZyb20pOwogICAg
IEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CiAKLSAgICBy
dW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNvZGVQYXRoKCF0ZXh0LT5jYW5Vc2VTaW1wbGVGb250Q29k
ZVBhdGgoKSk7CisgICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC5jYW5V
c2VTaW1wbGVGb250Q29kZVBhdGgoKSk7CiAgICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hp
dGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKICAgICBydW4uc2V0WFBvcyh4UG9zKTsKICAgICBy
ZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CkBA
IC01MjQsNyArNTg1LDcgQEAgaW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3go
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmwKICAgICBsaW5lTWlkcG9p
bnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFw
aFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNldCgpKSk7
CiB9CiAKLWlubGluZSB2b2lkIHRyeUh5cGhlbmF0aW5nKFJlbmRlclRleHQqIHRleHQsIGNvbnN0
IEZvbnRDYXNjYWRlJiBmb250LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZpZXIs
IHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVIeXBo
ZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50IG1pbmltdW1TdWZm
aXhMaW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZsb2F0IHhQb3MsIGlu
dCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNw
YWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJlYWss
IGludCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5hdGVkKQoraW5saW5lIHZvaWQgdHJ5SHlw
aGVuYXRpbmcoUmVuZGVyVGV4dCYgdGV4dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNvbnN0
IEF0b21pY1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBo
ZW5hdGVkTGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQgbWlu
aW11bVByZWZpeExpbWl0LCBpbnQgbWluaW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0U3Bh
Y2UsIHVuc2lnbmVkIHBvcywgZmxvYXQgeFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29sIGlz
Rml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3JkU3Bh
Y2luZywgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJvb2wm
IGh5cGhlbmF0ZWQpCiB7CiAgICAgLy8gTWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxhZnRl
cn06IGF1dG87JyB0byAyLgogICAgIHVuc2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7CkBAIC01
NTQsOSArNjE1LDkgQEAgaW5saW5lIHZvaWQgdHJ5SHlwaGVuYXRpbmcoUmVuZGVyVGV4dCogdGV4
dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNvbnN0IEF0b20KICAgICBpZiAobWF4UHJlZml4
V2lkdGggPD0gZm9udC5waXhlbFNpemUoKSAqIDUgLyA0KQogICAgICAgICByZXR1cm47CiAKLSAg
ICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOwotICAgIFRleHRSdW4g
cnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dCwgbGFz
dFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIHN0eWxlKTsKLSAgICBydW4uc2V0Q2hhcmFjdGVyc0xl
bmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBsYXN0U3BhY2UpOworICAgIGNvbnN0IFJlbmRlclN0
eWxlJiBzdHlsZSA9IHRleHQuc3R5bGUoKTsKKyAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2Nr
Ojpjb25zdHJ1Y3RUZXh0UnVuKCZ0ZXh0LCBmb250LCAmdGV4dCwgbGFzdFNwYWNlLCBwb3MgLSBs
YXN0U3BhY2UsIHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LnRleHRM
ZW5ndGgoKSAtIGxhc3RTcGFjZSk7CiAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkg
Pj0gcnVuLmxlbmd0aCgpKTsKIAogICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRlU3Bh
Y2UsIHN0eWxlLnRhYlNpemUoKSk7CkBAIC01NjYsMTQgKzYyNywxNCBAQCBpbmxpbmUgdm9pZCB0
cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwg
Y29uc3QgQXRvbQogICAgIGlmIChwcmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQog
ICAgICAgICByZXR1cm47CiAKLSAgICBwcmVmaXhMZW5ndGggPSBsYXN0SHlwaGVuTG9jYXRpb24o
U3RyaW5nVmlldyh0ZXh0LT50ZXh0KCkpLnN1YnN0cmluZyhsYXN0U3BhY2UsIHBvcyAtIGxhc3RT
cGFjZSksIHN0ZDo6bWluKHByZWZpeExlbmd0aCwgcG9zIC0gbGFzdFNwYWNlIC0gbWluaW11bVN1
ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJZGVudGlmaWVyKTsKKyAgICBwcmVmaXhMZW5ndGggPSBs
YXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyh0ZXh0LnRleHQoKSkuc3Vic3RyaW5nKGxhc3RT
cGFjZSwgcG9zIC0gbGFzdFNwYWNlKSwgc3RkOjptaW4ocHJlZml4TGVuZ3RoLCBwb3MgLSBsYXN0
U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50aWZpZXIpOwogICAg
IGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgp
CiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFdoZW4gbGFzdFNwYWNlIGlzIGEgc3BhY2UsIHdo
aWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBs
aW5lIG9yIGFmdGVyIGNvbGxhcHNlZAogICAgIC8vIHNwYWNlLCBpdCBzaG91bGQgbm90IGNvdW50
IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KICAgICBpZiAocHJlZml4TGVuZ3RoID09
IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKLSAgICAgICAgVUNoYXIgY2hhcmFjdGVyQXRMYXN0U3Bh
Y2UgPSB0ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOworICAgICAgICBVQ2hhciBjaGFyYWN0
ZXJBdExhc3RTcGFjZSA9IHRleHQuY2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKICAgICAgICAgaWYg
KGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAn
XG4nIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVyQXRMYXN0U3Bh
Y2UgPT0gbm9CcmVha1NwYWNlKQogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTU4OCw3
ICs2NDksNyBAQCBpbmxpbmUgdm9pZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBj
b25zdCBGb250Q2FzY2FkZSYgZm9udCwgY29uc3QgQXRvbQogICAgIFVOVVNFRF9QQVJBTShpc0Zp
eGVkUGl0Y2gpOwogI2VuZGlmCiAKLSAgICBsaW5lQnJlYWsubW92ZVRvKHRleHQsIGxhc3RTcGFj
ZSArIHByZWZpeExlbmd0aCwgbmV4dEJyZWFrYWJsZSk7CisgICAgbGluZUJyZWFrLm1vdmVUbygm
dGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWthYmxlKTsKICAgICBoeXBo
ZW5hdGVkID0gdHJ1ZTsKIH0KIApAQCAtNjEwLDkgKzY3MSw5IEBAIGlubGluZSBib29sIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRz
LCBib29sCiAgICAgICAgIGF1dG8mIGNvbWJpbmVSZW5kZXJlciA9IGRvd25jYXN0PFJlbmRlckNv
bWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOwogICAgICAgICBjb21iaW5lUmVuZGVy
ZXIuY29tYmluZVRleHQoKTsKICAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIn
cyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlv
bnMKLSAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1f
bGluZUJyZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7CisgICAgICAgIGlmIChpdGVyYXRvcklzQmV5
b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpLCBj
b21iaW5lUmVuZGVyZXIpKSB7CiAgICAgICAgICAgICBBU1NFUlQoaXRlcmF0b3JJc0JleW9uZEVu
ZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBjb21iaW5lUmVuZGVy
ZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAgICAg
bV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwogICAgICAgICAgICAgbV9yZXNvbHZlci5p
bmNyZW1lbnQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY3NCw3ICs3MzUsNyBAQCBpbmxpbmUg
Ym9vbCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1l
YXN1cmVtZW50cywgYm9vbAogICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwg
Jm1fYmxvY2ssICZtX3dpZHRoKTsKIAogICAgICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYmIG1f
YXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9u
ZSkgewotICAgICAgICAgICAgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgoJnJlbmRl
clRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgICAgIGh5cGhlbldpZHRoID0g
bWVhc3VyZUh5cGhlbldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKICAg
ICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7CiAgICAg
ICAgIH0KIApAQCAtNjg1LDcgKzc0Niw3IEBAIGlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6
aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAgICAg
ICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAoIW1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQ
KSkgewogICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOwogICAgICAgICAgICAgYm9vbCBt
aWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1
cnJlbnQub2Zmc2V0KCkgKyAxIDwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RS
QUlMKHJlbmRlclRleHRbbV9jdXJyZW50Lm9mZnNldCgpICsgMV0pOwotICAgICAgICAgICAgY2hh
cldpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zmc2V0KCksIG1pZFdv
cmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNvbW1p
dHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwg
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0
V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJyZW50Lm9mZnNldCgpLCBtaWRXb3JkQnJlYWtJc0JlZm9y
ZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsg
d3JhcFcsIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMs
IHRleHRMYXlvdXQpOwogICAgICAgICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0
ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7
CiAgICAgICAgIH0KIApAQCAtNzIyLDkgKzc4Myw5IEBAIGlubGluZSBib29sIEJyZWFraW5nQ29u
dGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29s
CiAKICAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGg7CiAgICAgICAgICAgICBp
ZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjID09ICcgJykKLSAgICAgICAgICAgICAgICBh
ZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1f
Y3VycmVudC5vZmZzZXQoKSArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdp
ZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVu
dC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGg7Cisg
ICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0
LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1f
d2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2Us
IHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGlu
Z1NwYWNlV2lkdGg7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRkaXRpb25h
bFRlbXBXaWR0aCA9IHRleHRXaWR0aCgmcmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQu
b2Zmc2V0KCkgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4
ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0Zv
bnRzLCB0ZXh0TGF5b3V0KTsKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoID0g
dGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpIC0gbGFz
dFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91
dCk7CiAKICAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0Vt
cHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIHdvcmRN
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7CkBAIC03NTIsNyAr
ODEzLDcgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFz
dXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAgICAgICAgICAvLyBhcyBj
YW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KICAgICAgICAgICAgICAgICBib29sIGxpbmVX
YXNUb29XaWRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGlu
ZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzV1MgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25s
eUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgICAgICAg
ICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zm
c2V0KCksIDEsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9j
b2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5
b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAg
ICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVu
dC5vZmZzZXQoKSwgMSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNo
LCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRl
eHRMYXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwogICAgICAg
ICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRo
ZSBleHRyYSBzcGFjZQogICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBs
aW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIC8vIElm
IHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLApAQCAt
NzYwLDMwICs4MjEsMzQgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0
KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAgICAgICAg
ICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgogICAgICAgICAgICAgICAgICAgICBpZiAo
IW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgewogICAg
ICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAgICAgICAgICAg
ICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1
cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBUcmFpbGluZ1doaXRlc3BhY2Uo
bV9saW5lQnJlYWssIG1fbGluZUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5l
QnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIo
KSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrZXIuc2tpcFRyYWlsaW5n
V2hpdGVzcGFjZShtb2RpZnlNZSwgbV9saW5lSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAg
ICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0c09uTGluZSgpKSB7CiAg
ICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1fd2lkdGguZml0c09uTGlu
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGluZygmcmVuZGVyVGV4
dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBtX2Js
b2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRC
ZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwgbV9jdXJy
ZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBXaWR0
aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0
ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5uZXh0
QnJlYWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworICAgICAg
ICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJh
dG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0
aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBo
ZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0
U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0
aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBt
X2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1
cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVk
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV9hdEVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhay5hdFRleHRQYXJhZ3JhcGhTZXBh
cmF0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmF0
VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
IXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkgPiAwKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1p
ZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVC
cmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlz
dG9yeS5pbmNyZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0
UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAg
d29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNldCgpOworICAgICAg
ICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFr
SGlzdG9yeS5vZmZzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICBpZiAobV9saW5lQnJlYWsub2Zmc2V0KCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9s
aW5lQnJlYWsucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFr
LnJlbmRlcmVyKCkpLnRleHRMZW5ndGgoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9saW5l
QnJlYWsucmVuZGVyZXIoKSkuY2hhcmFjdGVyQXQobV9saW5lQnJlYWsub2Zmc2V0KCkgLSAxKSA9
PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAmJiBkb3duY2FzdDxS
ZW5kZXJUZXh0PihtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVu
ZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS50ZXh0TGVuZ3RoKCkgJiYg
ZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS5jaGFy
YWN0ZXJBdChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkgLSAxKSA9PSBzb2Z0SHlwaGVuICYm
IHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAg
IGh5cGhlbmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsu
b2Zmc2V0KCkgJiYgbV9saW5lQnJlYWsub2Zmc2V0KCkgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJl
bWVudC5lbmRPZmZzZXQgJiYgIXdvcmRNZWFzdXJlbWVudC53aWR0aCkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpICYmIG1fbGluZUJyZWFrSGlz
dG9yeS5vZmZzZXQoKSAhPSAodW5zaWduZWQpd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCAmJiAh
d29yZE1lYXN1cmVtZW50LndpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hh
cldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVu
ZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0
KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0g
Y2hhcldpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg
ICB9CkBAIC04MDcsNyArODcyLDcgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5k
bGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAg
ICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkp
CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1p
ZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CiAgICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFr
QXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCks
IG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5
LmluY3JlbWVudCgpOwogICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5KHRydWUpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAg
ICAgICAgfQpAQCAtODIzLDcgKzg4OCw3IEBAIGlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6
aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAgICAg
ICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dFVF9H
Q19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7CiAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIg
dGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCiAgICAgICAgICAgICAgICAgLy8g
YWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0gICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCks
IG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWtIaXN0b3J5Lm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9m
ZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOwogICAgICAgICAgICAg
ICAgIG1pZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7CiAgICAgICAgICAg
ICB9CiAKQEAgLTg3OSw3ICs5NDQsNyBAQCBpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbAogCiAgICAg
ICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBwcmV2aW91c0NoYXJhY3RlcklzV1Mp
IHsKICAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5icmVha09u
bHlBZnRlcldoaXRlU3BhY2UoKSkKLSAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8o
bV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRC
cmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3Rvcnku
bW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVu
dC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobV9j
b2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9pZ25v
cmluZ1NwYWNlcykKQEAgLTg5OCw3ICs5NjMsNyBAQCBpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRl
eHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbAog
ICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OwogCiAgICAgLy8gSU1Q
T1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgZmxvYXQgYWRkaXRp
b25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKCZyZW5kZXJU
ZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwgZm9udCwgbV93
aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwg
d29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgIGZsb2F0IGFk
ZGl0aW9uYWxUZW1wV2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aChyZW5k
ZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwgZm9udCwg
bV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwogICAgIHdvcmRN
ZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKICAgICB3b3JkTWVhc3VyZW1lbnQu
ZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOwogICAgIHdvcmRNZWFzdXJlbWVudC53aWR0
aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRTcGFj
aW5nRm9yV29yZE1lYXN1cmVtZW50OwpAQCAtOTE3LDEwICs5ODIsMTMgQEAgaW5saW5lIGJvb2wg
QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJl
bWVudHMsIGJvb2wKICAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwogCiAgICAgaWYgKCFt
X3dpZHRoLmZpdHNPbkxpbmUoKSkgewotICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQotICAgICAg
ICAgICAgdHJ5SHlwaGVuYXRpbmcoJnJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBj
b25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRM
aW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5jdXJy
ZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNp
bmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGlu
ZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSkgeworICAg
ICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2Rp
ZnlNZSkgeworICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQs
IHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxl
Lmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCks
IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZz
ZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lk
dGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwg
bGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBv
c2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgIH0pOwor
ICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGluZUJyZWFrLnByZXZp
b3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhl
bnNOb25lKSB7CisgICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVha0hpc3Rvcnku
cHJldmlvdXNJblNhbWVOb2RlKCkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0g
SHlwaGVuc05vbmUpIHsKICAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwogICAgICAgICAg
ICAgbV9hdEVuZCA9IHRydWU7CiAgICAgICAgIH0KQEAgLTEwMDgsMTMgKzEwNzYsMTIgQEAgaW5s
aW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRl
ZCgpCiAKICAgICBpZiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc0Zsb2F0aW5nT3JPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpIHsKICAgICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJyZW50LnJlbmRl
cmVyKCk7Ci0gICAgICAgIGlmIChtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSAmJiBtX2F1dG9X
cmFwICYmICFtX2xhc3RPYmplY3QtPmlzUnVieVJ1bigpICYmICghbV9sYXN0T2JqZWN0LT5pc0lt
YWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghaXM8UmVuZGVyTGlzdE1hcmtlcj4o
Km1fbGFzdE9iamVjdCkgfHwgZG93bmNhc3Q8UmVuZGVyTGlzdE1hcmtlcj4oKm1fbGFzdE9iamVj
dCkuaXNJbnNpZGUoKSkpIHsKKyAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgp
ICYmIG1fYXV0b1dyYXAgJiYgIW1fbGFzdE9iamVjdC0+aXNSdWJ5UnVuKCkgJiYgKCFtX2xhc3RP
YmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFpczxSZW5kZXJM
aXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KSB8fCBkb3duY2FzdDxSZW5kZXJMaXN0TWFya2VyPigq
bV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkKICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0
Q3VycmVudFdpZHRoKCptX25leHRPYmplY3QpOwotICAgICAgICB9CiAgICAgfQogfQogCi1pbmxp
bmUgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjaGVja01pZHBvaW50
cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiBs
QnJlYWspCitpbmxpbmUgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBj
aGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBsQnJlYWspCiB7CiAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBs
YXN0IG1pZHBvaW50IGlzIGEgc3RhcnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJyZWFrLiBJZiBz
bywKICAgICAvLyBzaGF2ZSBpdCBvZmYgdGhlIGxpc3QsIGFuZCBzaGF2ZSBvZmYgYSB0cmFpbGlu
ZyBzcGFjZSBpZiB0aGUgcHJldmlvdXMgZW5kIHBvaW50IGRvZXNuJ3QKQEAgLTEwNDAsMTIgKzEx
MDcsMTIgQEAgaW5saW5lIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3Qg
Y2hlY2tNaWRwb2ludHMoTGluZU1pZHBvaW50U3RhdGUKIAogaW5saW5lIElubGluZUl0ZXJhdG9y
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKIHsKLSAgICBpZiAobV9saW5lQnJl
YWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7Ci0gICAgICAgIGlmICghbV9saW5lQnJlYWsu
cmVuZGVyZXIoKSB8fCAhbV9saW5lQnJlYWsucmVuZGVyZXIoKS0+aXNCUigpKSB7CisgICAgaWYg
KG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCkgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7
CisgICAgICAgIGlmICghbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkgfHwgIW1fbGluZUJy
ZWFrSGlzdG9yeS5yZW5kZXJlcigpLT5pc0JSKCkpIHsKICAgICAgICAgICAgIC8vIHdlIGp1c3Qg
YWRkIGFzIG11Y2ggYXMgcG9zc2libGUKICAgICAgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUud2hp
dGVTcGFjZSgpID09IFBSRSAmJiAhbV9jdXJyZW50Lm9mZnNldCgpKQogICAgICAgICAgICAgICAg
IGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2xhc3RPYmplY3QsIG1fbGFzdE9iamVj
dC0+aXNUZXh0KCkgPyBtX2xhc3RPYmplY3QtPmxlbmd0aCgpIDogMCk7Ci0gICAgICAgICAgICBl
bHNlIGlmIChtX2xpbmVCcmVhay5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBlbHNlIGlmICht
X2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSkgewogICAgICAgICAgICAgICAgIC8vIERvbid0
IGV2ZXIgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCiAg
ICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFsbC4gV2UganVzdCBoYXZlIHRv
IGJlIG9uIHRoaXMgbGluZSwKICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBz
cGlsbCBvdXQuCkBAIC0xMDUzLDMxICsxMTIwLDY2IEBAIGlubGluZSBJbmxpbmVJdGVyYXRvciBC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCiAgICAgICAgICAgICB9CiAgICAgICAg
IH0KICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIvb2Jq
ZWN0LgotICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKQot
ICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgIGlmIChtX2xpbmVC
cmVha0hpc3RvcnkuY3VycmVudCgpID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAgICAg
ICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKICAgICB9IGVsc2UgaWYgKCFtX2N1
cnJlbnQub2Zmc2V0KCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dpZHRoLnVu
Y29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCkg
ewogICAgICAgICAvLyBEbyBub3QgcHVzaCB0aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIG5leHQg
bGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNvbWUgY29udGVudCwgYnV0IGl0IGlzIHN0aWxsIGNv
bnNpZGVyZWQgZW1wdHkuCiAgICAgICAgIC8vIEVtcHR5IGlubGluZSBlbGVtZW50cyBsaWtlIDxz
cGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBhbmQgbm93IHdlIGp1c3QgaWdub3Jl
IHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKICAgICAgICAgLy8gYXQgdGhlIHN0YXJ0IG9mIGEg
bGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHlldC4KICAgICAgICAgLy8gQmVo
YXZlIGFzIGlmIGl0IHdhcyBhY3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBvbmUg
b2JqZWN0LgotICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgbV9saW5l
QnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwogICAgIH0KIAogICAgIC8vIFNhbml0eSBjaGVjayBv
dXIgbWlkcG9pbnRzLgotICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JO
b3QgY29sbGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5l
QnJlYWspOworICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29s
bGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtI
aXN0b3J5LmN1cnJlbnQoKSk7CiAKLSAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2lu
dHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrLCBjb2xs
YXBzZWQpOworICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5n
Qm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSwg
Y29sbGFwc2VkKTsKIAogICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4gaXRl
cmF0b3IgdGhhdCBwb2ludHMgcGFzdCB0aGUgZW5kCiAgICAgLy8gb2YgdGhlIG9iamVjdC4gRG8g
dGhpcyBhZGp1c3RtZW50IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0CiAgICAgLy8gb2Yg
dGhlIG5leHQgb2JqZWN0IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9mIHRo
ZQogICAgIC8vIGNvZGUuCi0gICAgaWYgKG1fbGluZUJyZWFrLm9mZnNldCgpKSB7Ci0gICAgICAg
IG1fbGluZUJyZWFrLnNldE9mZnNldChtX2xpbmVCcmVhay5vZmZzZXQoKSAtIDEpOwotICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9m
ZnNldCgpKSB7CisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS51cGRhdGUoW10oSW5saW5lSXRl
cmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICBtb2RpZnlNZS5zZXRPZmZzZXQobW9kaWZ5
TWUub2Zmc2V0KCkgLSAxKTsKKyAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVudCgpOworICAg
ICAgICB9KTsKICAgICB9CiAKLSAgICByZXR1cm4gbV9saW5lQnJlYWs7CisjaWYgRU5BQkxFKENT
U19UUkFJTElOR19XT1JEKQorICAgIGlmIChtX2Jsb2NrU3R5bGUudHJhaWxpbmdXb3JkKCkgPT0g
VHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNlZCkgeworICAgICAgICBJbmxpbmVJdGVyYXRv
ciBsaW5lQnJlYWsgPSBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOworICAgICAgICBpZiAo
bGluZUJyZWFrLnJlbmRlcmVyKCkgJiYgbV9saW5lSW5mby5pc0ZpcnN0TGluZSgpICYmICFiaWRp
TmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKCpsaW5lQnJlYWsucm9vdCgpLCBsaW5lQnJlYWsucmVu
ZGVyZXIoKSkgJiYgaXM8UmVuZGVyVGV4dD4obGluZUJyZWFrLnJlbmRlcmVyKCkpKSB7CisgICAg
ICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKmxp
bmVCcmVhay5yZW5kZXJlcigpKTsKKyAgICAgICAgICAgIC8vIERvbid0IGV2ZW4gYm90aGVyIG1l
YXN1cmluZyBpZiBvdXIgcmVtYWluaW5nIGxpbmUgaGFzIG1hbnkgY2hhcmFjdGVycworICAgICAg
ICAgICAgaWYgKHJlbmRlclRleHQudGV4dExlbmd0aCgpID09IGxpbmVCcmVhay5vZmZzZXQoKSB8
fCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAtIGxpbmVCcmVhay5vZmZzZXQoKSA+IDIwKQorICAg
ICAgICAgICAgICAgIHJldHVybiBsaW5lQnJlYWs7CisgICAgICAgICAgICBib29sIGlzTG9vc2VD
SktNb2RlID0gbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgIT0gJnJlbmRlclRleHQgJiYgbV9yZW5k
ZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLmlzTG9vc2VDSktNb2RlKCk7CisgICAgICAg
ICAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPm5ic3BN
b2RlKCkgPT0gU1BBQ0U7CisgICAgICAgICAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0g
bGluZUJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbigpOworICAgICAgICAgICAgaXNCcmVha2Fi
bGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBsaW5lQnJlYWsub2Zmc2V0
KCkgKyAxLCBuZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCwgaXNMb29zZUNKS01vZGUp
OworICAgICAgICAgICAgaWYgKG5leHRCcmVha2FibGVQb3NpdGlvbiA8IDAgfHwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KG5leHRCcmVha2FibGVQb3NpdGlvbikgIT0gcmVuZGVyVGV4dC50ZXh0TGVu
Z3RoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVCcmVhazsKKyAgICAgICAgICAgIGNv
bnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZShyZW5kZXJUZXh0LCBtX2xpbmVJbmZv
KTsKKyAgICAgICAgICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUuZm9udENhc2Nh
ZGUoKTsKKyAgICAgICAgICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGR1bW15Rm9udHM7CisgICAg
ICAgICAgICBJbmxpbmVJdGVyYXRvciBiZXN0ID0gbGluZUJyZWFrOworICAgICAgICAgICAgZm9y
IChzaXplX3QgaSA9IDE7IGkgPCBtX2xpbmVCcmVha0hpc3RvcnkuaGlzdG9yeUxlbmd0aCgpOyAr
K2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2FuZGlkYXRlID0g
bV9saW5lQnJlYWtIaXN0b3J5LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRl
LnJlbmRlcmVyKCkgIT0gbGluZUJyZWFrLnJlbmRlcmVyKCkpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBiZXN0OworICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gdGV4dFdpZHRoKHJl
bmRlclRleHQsIGNhbmRpZGF0ZS5vZmZzZXQoKSwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgLSBj
YW5kaWRhdGUub2Zmc2V0KCksIGZvbnQsIDAsIGZvbnQuaXNGaXhlZFBpdGNoKCksIG1fY29sbGFw
c2VXaGl0ZVNwYWNlLCBkdW1teUZvbnRzKTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBt
X3dpZHRoLmF2YWlsYWJsZVdpZHRoKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0
OworICAgICAgICAgICAgICAgIGlmICh3aWR0aCAvIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSA+
IDAuMSkgLy8gU3Vic2VxdWVudCBsaW5lIGlzIGxvbmcgZW5vdWdoCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBjYW5kaWRhdGU7CisgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICB9CisgICAg
fQorI2VuZGlmCisgICAgcmV0dXJuIG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7CiB9CiAK
IH0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5n
ZUxvZwppbmRleCBjNDQ3M2JjYmFhZWRiZjU0NjgzYTJkNTUyYjMyNzY2MDljYTE3ZTdkLi5hN2Ji
ODg1MzM4ZGMyNjFhZjU1MzE1OTY3YWVlNDJlY2IxYzhkYTU1IDEwMDY0NAotLS0gYS9MYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMg
QEAKKzIwMTUtMDMtMDMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNvbT4K
KworICAgICAgICBJbXBsZW1lbnQgLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFs
bHktYmFsYW5jZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE0MjI1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRtbDogQWRkZWQuCisgICAg
ICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbDogQWRkZWQuCisKIDIwMTUtMDMtMDMg
IEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAKICAgICAgICAgW1dpbl0gRG9j
dW1lbnQgbW9yZSBkZWJ1ZyBhc3NlcnRpb25zLgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFz
dC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3QvdGV4
dC90cmFpbGluZy13b3JkLWV4cGVjdGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjYwMjRhZGI1NzNiZjc5
YjAyYWY0NjFlYmY3NjhlNGE4YzQxYWEzZQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3Rz
L2Zhc3QvdGV4dC90cmFpbGluZy13b3JkLWV4cGVjdGVkLmh0bWwKQEAgLTAsMCArMSwxNSBAQAor
PCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPC9oZWFkPgorPGJvZHk+CitUaGlzIHRl
c3QgbWFrZXMgc3VyZSB0aGF0IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5
LWJhbGFuY2VkIGJyZWFrcyBsaW5lcyBjb3JyZWN0bHkuCis8ZGl2IHN0eWxlPSJmb250LWZhbWls
eTogQWhlbTsiPgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERF
RiBHSEkgSktMPGJyPk1OTzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVW
VyBYWVogQUJDIERFRiBHSEk8YnI+SktMIE1OTzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wg
TU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHIEg8YnI+SSBKIEs8L2Rpdj4KKzxkaXY+QUJDIERF
RiBHSEkgSktMIE1OTyBQUVJTIFRVVlcgWFlaIEFCQyBERUYgR0hJIEpLTDxicj5NTk8gUFFSUzwv
ZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHSEkg
SktMPGJyPk1OTyBQUVJTIFRVViBXWFlaIEFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVY8YnI+
V1hZWjwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9MYXlvdXRU
ZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0
L3RyYWlsaW5nLXdvcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMDgyNGU1NGU1ZGFiZjBmOTJmODhlNmJm
YjNhM2Q1MGM5MDlkODM4Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0
L3RyYWlsaW5nLXdvcmQuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxo
dG1sPgorPGhlYWQ+Cis8L2hlYWQ+Cis8Ym9keT4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQg
LWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQgYnJlYWtzIGxp
bmVzIGNvcnJlY3RseS4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBBaGVtOyI+Cis8ZGl2PkFC
QyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PPC9kaXY+
Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxh
bmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wg
TU5PPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRp
YWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVG
IEcgSCBJIEogSzwvZGl2PgorPGRpdiBzdHlsZT0iLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBs
ZS1wYXJ0aWFsbHktYmFsYW5jZWQ7Ij5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVog
QUJDIERFRiBHSEkgSktMIE1OTyBQUVJTPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxp
bmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8g
UFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWIFdYWVogQUJDIERFRiBH
SEkgSktMIE1OTyBQUVJTIFRVViBXWFlaPC9kaXY+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247833</attachid>
            <date>2015-03-03 20:50:02 -0800</date>
            <delta_ts>2015-03-04 12:41:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142253-20150303204944.patch</filename>
            <type>text/plain</type>
            <size>46971</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgwOTQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMWE2NGNiOGE5NzFjZjA4
MTFlOGI5NzI2NmZkNmNhOTIxODg4ZWQ0Mi4uNTg3Y2I0MTkwYzAxMjBiMzMwZWVkYTRjZDc2ZmE3
YmVlZDc2NTA4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDcwIEBACiAyMDE1LTAzLTAzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKKyAgICAgICAgSW1wbGVtZW50
IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDIyNTMKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGltcGxl
bWVudHMgYSBoaXN0b3J5IG1lY2hhbmlzbSBmb3IgbGluZSBicmVha2luZy4gSW4gcGFydGljdWxh
ciwgdGhpcyBwYXRjaCBwYXJ0aXRpb25zCisgICAgICAgIHRoZSB1cGRhdGVzIHRvIHRoZSBjdXJy
ZW50IGxpbmUgYnJlYWtpbmcgbG9jYXRpb24gaW50byB0d28ga2luZHM6IGNvbmNlcHR1YWxseSBu
ZXcgYnJlYWtpbmcgbG9jYXRpb25zLAorICAgICAgICBhbmQgZml4dXBzIHRvIGV4aXN0aW5nIGxv
Y2F0aW9ucy4gVGhlbiwgdGhpcyBwYXRjaCByZW1lbWJlcnMgYWxsIHRoZSBmaXhlZCB1cCBicmVh
a2luZyBsb2NhdGlvbnMsIHVwCisgICAgICAgIHRvIGEgbWF4aW11bSBudW1iZXIgb2YgcmVtZW1i
ZXJlZCBsb2NhdGlvbnMuCisKKyAgICAgICAgVGhlIHBhdGNoIHRoZW4gdXNlcyB0aGlzIG1lbW9y
eSB0byBjaGFuZ2UgdGhlIGxpbmUtYnJlYWtpbmcgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBydWxl
cyBvZgorICAgICAgICAtYXBwbGUtdHJhaWxpbmctd29yZC4KKworICAgICAgICBUaGlzIHBhdGNo
IGFsc28gcGVyZm9ybXMgc29tZSBjbGVhbnVwIG9mIEJyZWFraW5nQ29udGV4dCwgdXNpbmcgbnVs
bHB0ciBpbnN0ZWFkIG9mIDAgYW5kIG1pZ3JhdGluZworICAgICAgICBub24tbnVsbCBwb2ludGVy
cyB0byByZWZlcmVuY2VzLgorCisgICAgICAgIFRlc3Q6IGZhc3QvdGV4dC90cmFpbGluZy13b3Jk
Lmh0bWwKKworICAgICAgICAqIHJlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oOiBVc2UgbnVsbHB0
ciBpbnN0ZWFkIG9mIDAKKyAgICAgICAgKFdlYkNvcmU6OklubGluZUl0ZXJhdG9yOjpJbmxpbmVJ
dGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVJdGVyYXRvcjo6Y2xlYXIpOgorICAg
ICAgICAoV2ViQ29yZTo6YmlkaU5leHRTaGFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6YmlkaU5l
eHRTa2lwcGluZ0VtcHR5SW5saW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpiaWRpTmV4dEluY2x1
ZGluZ0VtcHR5SW5saW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVXYWxrZXI6OklubGlu
ZVdhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KToK
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDogVXNlIHJlZmVy
ZW5jZXMgaW5zdGVhZCBvZiBwb2ludGVycworICAgICAgICAoV2ViQ29yZTo6c2V0TG9naWNhbFdp
ZHRoRm9yVGV4dFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1
dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAgICAgKiByZW5kZXJp
bmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg6CisgICAgICAgIFVzZSBJbmxp
bmVJdGVyYXRvckhpc3RvcnkgYXMgYSBwcm94eSBmb3IgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9j
YXRpb24uIE5vdGUgdGhhdCBhbGwgdGhlc2UgZnVuY3Rpb25zCisgICAgICAgIGFyZSBpbmxpbmVk
LCBzbyB0aGUgb3ZlcmhlYWQgc2hvdWxkIGJlIG5leHQgdG8gbm90aGluZyB3aGVuIC1hcHBsZS10
cmFpbGluZy13b3JkIGlzIG5vdCBpbiB1c2UuCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0Nv
bnRleHQ6OkJyZWFraW5nQ29udGV4dCk6IFVzZSBJbmxpbmVJdGVyYXRvckhpc3RvcnkgaW5zdGVh
ZCBvZiBJbmxpbmVJdGVyYXRvcgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojps
aW5lQnJlYWspOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y2xl
YXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOiBEaXR0bworICAgICAgICAoV2ViQ29yZTo6QnJlYWtp
bmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6IERpdHRvCisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5KTogS2VlcHMgdHJhY2sgb2YgaGlzdG9yaWNhbAorICAgICAgICBicmVh
a2luZyBsb2NhdGlvbnMKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5OjpwdXNoKTogUmVtZW1iZXIgYSBuZXcgYnJlYWtpbmcgbG9jYXRpb24K
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5
Ojp1cGRhdGUpOiBVcGRhdGUgYW4gZXhpc3RpbmcgYnJlYWtpbmcgbG9jYXRpb24KKyAgICAgICAg
KFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpyZW5kZXJl
cik6IEZvcndhcmRlZCB0byB0aGUgY3VycmVudCBicmVha2luZyBsb2NhdGlvbgorICAgICAgICAo
V2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Om9mZnNldCk6
IERpdHRvCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9y
SGlzdG9yeTo6YXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKTogIERpdHRvCisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6cHJldmlvdXNJblNh
bWVOb2RlKTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5l
SXRlcmF0b3JIaXN0b3J5OjpnZXQpOiBHZXQgb25lIG9mIHRoZSByZW1lbWJlcmVkIGJyZWFraW5n
IGxvY2F0aW9ucworICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVy
YXRvckhpc3Rvcnk6OmN1cnJlbnQpOiBHZXQgdGhlIGN1cnJlbnQgYnJlYWtpbmcgbG9jYXRpb24K
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5
OjpoaXN0b3J5TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5s
aW5lSXRlcmF0b3JIaXN0b3J5Ojptb3ZlVG8pOiBGb3J3YXJkZWQgdG8gdGhlIGN1cnJlbnQgYnJl
YWtpZ24gbG9jYXRpb24uCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGlu
ZUl0ZXJhdG9ySGlzdG9yeTo6aW5jcmVtZW50KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpjbGVhcik6IERpdHRvCisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUJSKTogVXNlIElubGluZUl0ZXJh
dG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6Om1l
YXN1cmVIeXBoZW5XaWR0aCk6IFVzZSByZWZlcmVuY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMKKyAg
ICAgICAgKFdlYkNvcmU6OnRleHRXaWR0aCk6IERpdHRvCisgICAgICAgIChXZWJDb3JlOjp0cnlI
eXBoZW5hdGluZyk6IERpdHRvCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZVRleHQpOiBVc2UgcmVmZXJlbmNlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzLCBhbmQgdXNlCisg
ICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVh
a0lmTmVlZGVkKTogU3R5bGUKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrTWlkcG9pbnRzKTogVXNl
IElubGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSk6IElmIC1hcHBsZS10
cmFpbGluZy13b3JkIGlzIGluIGVmZmVjdCwgbG9vayBiYWNrIHRocm91Z2gKKyAgICAgICAgdGhl
IHJlbWVtYmVyZWQgYnJlYWtpbmcgbG9jYXRpb25zIGFuZCBjaG9vc2UgdGhlIG9wdGltYWwgb25l
LgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpsaW5lQnJlYWtSZWYpOiBEZWxl
dGVkLgorCisyMDE1LTAzLTAzICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5j
b20+CisKICAgICAgICAgQnJlYWtpbmdDb250ZXh0IGNsZWFudXAKICAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MjE0NgogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCmluZGV4IDdhNzZhYjk4NzA1ZjhmYjdkYTJkMGEyYzk2
Mjg0NDhkNTljNGE1MjYuLmE5ZWZlMGQwNmRhMjRjYjczMDAwYzU4NDdlODlmY2ZmZjg4ZmUzYzEg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCkBAIC0zNyw4ICsz
Nyw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIElubGluZUl0ZXJhdG9yIHsKIHB1Ymxp
YzoKICAgICBJbmxpbmVJdGVyYXRvcigpCi0gICAgICAgIDogbV9yb290KDApCi0gICAgICAgICwg
bV9yZW5kZXJlcigwKQorICAgICAgICA6IG1fcm9vdChudWxscHRyKQorICAgICAgICAsIG1fcmVu
ZGVyZXIobnVsbHB0cikKICAgICAgICAgLCBtX25leHRCcmVha2FibGVQb3NpdGlvbigtMSkKICAg
ICAgICAgLCBtX3BvcygwKQogICAgICAgICAsIG1fcmVmZXJzVG9FbmRPZlByZXZpb3VzTm9kZShm
YWxzZSkKQEAgLTU0LDcgKzU0LDcgQEAgcHVibGljOgogICAgIHsKICAgICB9CiAKLSAgICB2b2lk
IGNsZWFyKCkgeyBtb3ZlVG8oMCwgMCk7IH0KKyAgICB2b2lkIGNsZWFyKCkgeyBtb3ZlVG8obnVs
bHB0ciwgMCk7IH0KIAogICAgIHZvaWQgbW92ZVRvU3RhcnRPZihSZW5kZXJPYmplY3QqIG9iamVj
dCkKICAgICB7CkBAIC03OSw3ICs3OSw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFJlZmVyc1Rv
RW5kT2ZQcmV2aW91c05vZGUoKTsKIAogICAgIHZvaWQgZmFzdEluY3JlbWVudEluVGV4dE5vZGUo
KTsKLSAgICB2b2lkIGluY3JlbWVudChJbmxpbmVCaWRpUmVzb2x2ZXIqID0gMCk7CisgICAgdm9p
ZCBpbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiA9IG51bGxwdHIpOwogICAgIHZvaWQgZmFz
dERlY3JlbWVudCgpOwogICAgIGJvb2wgYXRFbmQoKSBjb25zdDsKIApAQCAtMjEyLDcgKzIxMiw3
IEBAIHN0YXRpYyBib29sIGlzRW1wdHlJbmxpbmUoY29uc3QgUmVuZGVySW5saW5lJiByZW5kZXJl
cikKIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBpdGVyYXRlIG92ZXIgaW5saW5lcyB3aXRoaW4gYSBi
bG9jaywgb3B0aW9uYWxseSBub3RpZnlpbmcKIC8vIGEgYmlkaSByZXNvbHZlciBhcyBpdCBlbnRl
cnMvZXhpdHMgaW5saW5lcyAoc28gaXQgY2FuIHB1c2gvcG9wIGVtYmVkZGluZyBsZXZlbHMpLgog
dGVtcGxhdGUgPGNsYXNzIE9ic2VydmVyPgotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJp
ZGlOZXh0U2hhcmVkKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlbmRlck9iamVjdCogY3VycmVudCwg
T2JzZXJ2ZXIqIG9ic2VydmVyID0gMCwgRW1wdHlJbmxpbmVCZWhhdmlvciBlbXB0eUlubGluZUJl
aGF2aW9yID0gU2tpcEVtcHR5SW5saW5lcywgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAwKQorc3Rh
dGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0U2hhcmVkKFJlbmRlckVsZW1lbnQmIHJv
b3QsIFJlbmRlck9iamVjdCogY3VycmVudCwgT2JzZXJ2ZXIqIG9ic2VydmVyID0gbnVsbHB0ciwg
RW1wdHlJbmxpbmVCZWhhdmlvciBlbXB0eUlubGluZUJlaGF2aW9yID0gU2tpcEVtcHR5SW5saW5l
cywgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSBudWxscHRyKQogewogICAgIFJlbmRlck9iamVjdCog
bmV4dCA9IG51bGxwdHI7CiAgICAgLy8gb2xkRW5kT2ZJbmxpbmUgZGVub3RlcyBpZiB3aGVuIHdl
IGxhc3Qgc3RvcHBlZCBpdGVyYXRpbmcgaWYgd2Ugd2VyZSBhdCB0aGUgZW5kIG9mIGFuIGlubGlu
ZS4KQEAgLTI3OCwxMyArMjc4LDEzIEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRp
TmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlCiAvLyBUaGlz
IG1ha2VzIGNhbGxlcnMgY2xlYW5lciBhcyB0aGV5IGRvbid0IGhhdmUgdG8gc3BlY2lmeSBhIHR5
cGUgZm9yIHRoZSBvYnNlcnZlciB3aGVuIG5vdCBwcm92aWRpbmcgb25lLgogc3RhdGljIGlubGlu
ZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoUmVuZGVyRWxlbWVu
dCYgcm9vdCwgUmVuZGVyT2JqZWN0KiBjdXJyZW50KQogewotICAgIElubGluZUJpZGlSZXNvbHZl
ciogb2JzZXJ2ZXIgPSAwOworICAgIElubGluZUJpZGlSZXNvbHZlciogb2JzZXJ2ZXIgPSBudWxs
cHRyOwogICAgIHJldHVybiBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKHJvb3QsIGN1cnJl
bnQsIG9ic2VydmVyKTsKIH0KIAotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0
SW5jbHVkaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3QsIFJlbmRlck9iamVjdCog
Y3VycmVudCwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAwKQorc3RhdGljIGlubGluZSBSZW5kZXJP
YmplY3QqIGJpZGlOZXh0SW5jbHVkaW5nRW1wdHlJbmxpbmVzKFJlbmRlckVsZW1lbnQmIHJvb3Qs
IFJlbmRlck9iamVjdCogY3VycmVudCwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSBudWxscHRyKQog
ewotICAgIElubGluZUJpZGlSZXNvbHZlciogb2JzZXJ2ZXIgPSAwOyAvLyBDYWxsZXJzIHdobyBp
bmNsdWRlIGVtcHR5IGlubGluZXMsIG5ldmVyIHVzZSBhbiBvYnNlcnZlci4KKyAgICBJbmxpbmVC
aWRpUmVzb2x2ZXIqIG9ic2VydmVyID0gbnVsbHB0cjsgLy8gQ2FsbGVycyB3aG8gaW5jbHVkZSBl
bXB0eSBpbmxpbmVzLCBuZXZlciB1c2UgYW4gb2JzZXJ2ZXIuCiAgICAgcmV0dXJuIGJpZGlOZXh0
U2hhcmVkKHJvb3QsIGN1cnJlbnQsIG9ic2VydmVyLCBJbmNsdWRlRW1wdHlJbmxpbmVzLCBlbmRP
ZklubGluZVB0cik7CiB9CiAKQEAgLTM1Myw3ICszNTMsNyBAQCBjbGFzcyBJbmxpbmVXYWxrZXIg
ewogcHVibGljOgogICAgIElubGluZVdhbGtlcihSZW5kZXJFbGVtZW50JiByb290KQogICAgICAg
ICA6IG1fcm9vdChyb290KQotICAgICAgICAsIG1fY3VycmVudCgwKQorICAgICAgICAsIG1fY3Vy
cmVudChudWxscHRyKQogICAgICAgICAsIG1fYXRFbmRPZklubGluZShmYWxzZSkKICAgICB7CiAg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGNsYXNzIHNob3VsZCBiZSB0YXVnaHQgaG93IHRvIGRvIHRo
ZSBTa2lwRW1wdHlJbmxpbmVzIGNvZGVwYXRoIGFzIHdlbGwuCkBAIC0zODcsNyArMzg3LDcgQEAg
aW5saW5lIHZvaWQgSW5saW5lSXRlcmF0b3I6OmluY3JlbWVudChJbmxpbmVCaWRpUmVzb2x2ZXIq
IHJlc29sdmVyKQogICAgICAgICBpZiAobV9wb3MgPCBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9y
ZW5kZXJlcikudGV4dExlbmd0aCgpKQogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAv
LyBiaWRpTmV4dCBjYW4gcmV0dXJuIDAsIHNvIHVzZSBtb3ZlVG8gaW5zdGVhZCBvZiBtb3ZlVG9T
dGFydE9mCisgICAgLy8gYmlkaU5leHQgY2FuIHJldHVybiBudWxscHRyLCBzbyB1c2UgbW92ZVRv
IGluc3RlYWQgb2YgbW92ZVRvU3RhcnRPZgogICAgIG1vdmVUbyhiaWRpTmV4dFNraXBwaW5nRW1w
dHlJbmxpbmVzKCptX3Jvb3QsIG1fcmVuZGVyZXIsIHJlc29sdmVyKSwgMCk7CiB9CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKaW5k
ZXggOTlkOWZhM2FmYzFkMzc0Yjg3MWQwODIzMjBmNmVhNzIwNTViZjY0ZC4uYTdhNzg4ODE2ZTBi
ZGJlZWQ0NmNlZWE3Zjk5ZDRhZDc1OGUyMjAzYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKQEAgLTQ1NSwxMyArNDU1LDEzIEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4s
IFJlbmRlclJ1YnlSdW4mIHJlbmRlcmVyCiAgICAgc2V0TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVy
ZXIsIC1lbmRPdmVyaGFuZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lk
dGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVy
VGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKK3N0
YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gq
IGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGZsb2F0IHhQb3Ms
IGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tG
b250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQ
b3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAg
IEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7CiAgICAgR2x5cGhPdmVyZmxvdyBn
bHlwaE92ZXJmbG93OwogCi0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBsaW5lU3R5bGUo
KnJlbmRlcmVyLT5wYXJlbnQoKSwgbGluZUluZm8pLmZvbnRDYXNjYWRlKCk7CisgICAgY29uc3Qg
Rm9udENhc2NhZGUmIGZvbnQgPSBsaW5lU3R5bGUoKnJlbmRlcmVyLnBhcmVudCgpLCBsaW5lSW5m
bykuZm9udENhc2NhZGUoKTsKICAgICAvLyBBbHdheXMgY29tcHV0ZSBnbHlwaCBvdmVyZmxvdyBp
ZiB0aGUgYmxvY2sncyBsaW5lLWJveC1jb250YWluIHZhbHVlIGlzICJnbHlwaHMiLgogICAgIGlm
IChsaW5lQm94LT5maXRzVG9HbHlwaHMoKSkgewogICAgICAgICAvLyBJZiB3ZSBkb24ndCBzdGlj
ayBvdXQgb2YgdGhlIHJvb3QgbGluZSdzIGZvbnQgYm94LCB0aGVuIGRvbid0IGJvdGhlciBjb21w
dXRpbmcgb3VyIGdseXBoIG92ZXJmbG93LiBUaGlzIG9wdGltaXphdGlvbgpAQCAtNDgzLDcgKzQ4
Myw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJ
bmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgZmxvYXQgbWVhc3VyZWRXaWR0aCA9
IDA7CiAKICAgICBib29sIGtlcm5pbmdJc0VuYWJsZWQgPSBmb250LnR5cGVzZXR0aW5nRmVhdHVy
ZXMoKSAmIEtlcm5pbmc7Ci0gICAgYm9vbCBjYW5Vc2VTaW1wbGVGb250Q29kZVBhdGggPSByZW5k
ZXJlci0+Y2FuVXNlU2ltcGxlRm9udENvZGVQYXRoKCk7CisgICAgYm9vbCBjYW5Vc2VTaW1wbGVG
b250Q29kZVBhdGggPSByZW5kZXJlci5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKICAgICAK
ICAgICAvLyBTaW5jZSB3ZSBkb24ndCBjYWNoZSBnbHlwaCBvdmVyZmxvd3MsIHdlIG5lZWQgdG8g
cmUtbWVhc3VyZSB0aGUgcnVuIGlmCiAgICAgLy8gdGhlIHN0eWxlIGlzIGxpbmVib3gtY29udGFp
bjogZ2x5cGguCkBAIC00OTQsMTggKzQ5NCwxOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc2V0TG9n
aWNhbFdpZHRoRm9yVGV4dFJ1bihSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBydQog
ICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3Vy
ZW1lbnRzW2ldOwogICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC53aWR0aCA8PSAwIHx8
IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9PSB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0
KQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudC5yZW5kZXJlciAhPSByZW5kZXJlciB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQg
IT0gbGFzdEVuZE9mZnNldCB8fCB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID4gcnVuLT5tX3N0
b3ApCisgICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LnJlbmRlcmVyICE9ICZyZW5kZXJl
ciB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgIT0gbGFzdEVuZE9mZnNldCB8fCB3b3Jk
TWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID4gcnVuLT5tX3N0b3ApCiAgICAgICAgICAgICAgICAgY29u
dGludWU7CiAKICAgICAgICAgICAgIGxhc3RFbmRPZmZzZXQgPSB3b3JkTWVhc3VyZW1lbnQuZW5k
T2Zmc2V0OwogICAgICAgICAgICAgaWYgKGtlcm5pbmdJc0VuYWJsZWQgJiYgbGFzdEVuZE9mZnNl
dCA9PSBydW4tPm1fc3RvcCkgewogICAgICAgICAgICAgICAgIGludCB3b3JkTGVuZ3RoID0gbGFz
dEVuZE9mZnNldCAtIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldDsKICAgICAgICAgICAgICAg
ICBHbHlwaE92ZXJmbG93IG92ZXJmbG93OwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGgg
Kz0gcmVuZGVyZXItPndpZHRoKHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCwgd29yZExlbmd0
aCwgeFBvcyArIG1lYXN1cmVkV2lkdGgsIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksCisgICAgICAg
ICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSByZW5kZXJlci53aWR0aCh3b3JkTWVhc3VyZW1lbnQu
c3RhcnRPZmZzZXQsIHdvcmRMZW5ndGgsIHhQb3MgKyBtZWFzdXJlZFdpZHRoLCBsaW5lSW5mby5p
c0ZpcnN0TGluZSgpLAogICAgICAgICAgICAgICAgICAgICAmd29yZE1lYXN1cmVtZW50LmZhbGxi
YWNrRm9udHMsICZvdmVyZmxvdyk7Ci0gICAgICAgICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVy
LT5jaGFyYWN0ZXJBdCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQpOworICAgICAgICAgICAg
ICAgIFVDaGFyIGMgPSByZW5kZXJlci5jaGFyYWN0ZXJBdCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRP
ZmZzZXQpOwogICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB3b3JkTGVuZ3RoID09IDEgJiYg
KGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lk
dGggKz0gcmVuZGVyZXItPnN0eWxlKCkuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpOworICAg
ICAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLnN0eWxlKCkuZm9udENh
c2NhZGUoKS53b3JkU3BhY2luZygpOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg
ICAgbWVhc3VyZWRXaWR0aCArPSB3b3JkTWVhc3VyZW1lbnQud2lkdGg7CiAgICAgICAgICAgICBp
ZiAoIXdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkgewpAQCAtNTIyLDcg
KzUyMiw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJv
b3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgfQogCiAgICAgaWYgKCFtZWFz
dXJlZFdpZHRoKQotICAgICAgICBtZWFzdXJlZFdpZHRoID0gcmVuZGVyZXItPndpZHRoKHJ1bi0+
bV9zdGFydCwgcnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZvLmlzRmly
c3RMaW5lKCksICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CisgICAgICAgIG1lYXN1
cmVkV2lkdGggPSByZW5kZXJlci53aWR0aChydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wIC0gcnVu
LT5tX3N0YXJ0LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCAmZmFsbGJhY2tGb250cywg
JmdseXBoT3ZlcmZsb3cpOwogCiAgICAgcnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKG1lYXN1
cmVkV2lkdGggKyBoeXBoZW5XaWR0aCk7CiAgICAgaWYgKCFmYWxsYmFja0ZvbnRzLmlzRW1wdHko
KSkgewpAQCAtNTM0LDcgKzUzNCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lk
dGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1CiAgICAgfQog
CiAgICAgLy8gSW5jbHVkZSB0ZXh0IGRlY29yYXRpb24gdmlzdWFsIG92ZXJmbG93IGFzIHBhcnQg
b2YgdGhlIGdseXBoIG92ZXJmbG93LgotICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS50ZXh0RGVj
b3JhdGlvbnNJbkVmZmVjdCgpICE9IFRleHREZWNvcmF0aW9uTm9uZSkKKyAgICBpZiAocmVuZGVy
ZXIuc3R5bGUoKS50ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCgpICE9IFRleHREZWNvcmF0aW9uTm9u
ZSkKICAgICAgICAgZ2x5cGhPdmVyZmxvdy5leHRlbmRUbyh2aXN1YWxPdmVyZmxvd0ZvckRlY29y
YXRpb25zKHJ1bi0+Ym94KCktPmxpbmVTdHlsZSgpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94Pihy
dW4tPmJveCgpKSkpOwogCiAgICAgaWYgKCFnbHlwaE92ZXJmbG93LmlzRW1wdHkoKSkgewpAQCAt
NzQ3LDcgKzc0Nyw3IEBAIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURp
cmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJvCiAgICAgICAgICAgICAgICAg
bmVlZHNXb3JkU3BhY2luZyA9ICFpc1NwYWNlT3JOZXdsaW5lKHJlbmRlclRleHQuY2hhcmFjdGVy
QXQocnVuLT5tX3N0b3AgLSAxKSkgJiYgcnVuLT5tX3N0b3AgPT0gbGVuZ3RoOwogICAgICAgICAg
ICAgfQogCi0gICAgICAgICAgICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHJ1
biwgJnJlbmRlclRleHQsIHRvdGFsTG9naWNhbFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFN
YXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgICAg
ICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHJ1biwgcmVuZGVyVGV4dCwgdG90
YWxMb2dpY2FsV2lkdGgsIGxpbmVJbmZvLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlv
bkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg
IGJvb2wgZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAo
aXM8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSAmJiB0ZXh0QWxpZ24gPT0gSlVTVElG
WSAmJiBydW4gIT0gdHJhaWxpbmdTcGFjZVJ1biAmJiBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihy
dW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkpIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaAppbmRl
eCA3ZDkwZWNlZjcwMzVmMmQ5N2UxNWQ0NjQwY2QyMDgxNTdlMTRmZDEwLi5hZTQyOTQxMDBiYzY1
NWZhZjYzMTI4ZTM3NDU3YzY4ZGE1YzIwZmQ5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCkBA
IC02OCw3ICs2OCwxMSBAQCBwdWJsaWM6CiAgICAgICAgIDogbV9saW5lQnJlYWtlcihsaW5lQnJl
YWtlcikKICAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29sdmVyKQogICAgICAgICAsIG1fY3VycmVu
dChyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAgICAsIG1fbGluZUJyZWFrKHJlc29sdmVyLnBv
c2l0aW9uKCkpCisjaWYgRU5BQkxFKENTU19UUkFJTElOR19XT1JEKQorICAgICAgICAsIG1fbGlu
ZUJyZWFrSGlzdG9yeShJbmxpbmVJdGVyYXRvcihyZXNvbHZlci5wb3NpdGlvbigpKSwgYmxvY2su
c3R5bGUoKS50cmFpbGluZ1dvcmQoKSA9PSBUcmFpbGluZ1dvcmQ6OlBhcnRpYWxseUJhbGFuY2Vk
ID8gNSA6IDEpCisjZWxzZQorICAgICAgICAsIG1fbGluZUJyZWFrSGlzdG9yeShJbmxpbmVJdGVy
YXRvcihyZXNvbHZlci5wb3NpdGlvbigpKSwgMSkKKyNlbmRpZgogICAgICAgICAsIG1fYmxvY2so
YmxvY2spCiAgICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5yZW5kZXJlcigpKQogICAg
ICAgICAsIG1fbmV4dE9iamVjdChudWxscHRyKQpAQCAtMTAxLDggKzEwNSw3IEBAIHB1YmxpYzoK
ICAgICB9CiAKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRPYmplY3QoKSB7IHJldHVybiBtX2N1
cnJlbnQucmVuZGVyZXIoKTsgfQotICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVhaygpIHsgcmV0
dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVha1JlZigpIHty
ZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVyYXRvciBsaW5lQnJlYWsoKSB7IHJl
dHVybiBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOyB9CiAgICAgTGluZVdpZHRoJiBsaW5l
V2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9CiAgICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJuIG1f
YXRFbmQ7IH0KIApAQCAtMTIzLDIxICsxMjYsODEgQEAgcHVibGljOgogICAgIHZvaWQgY2xlYXJM
aW5lQnJlYWtJZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkK
ICAgICB7CiAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1Nw
YWNlKSB8fCBtX2xhc3RXUyA9PSBOT1dSQVApCi0gICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVh
cigpOworICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmNsZWFyKCk7CiAgICAgfQogCiAg
ICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmplY3QmIG9iamVj
dCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQogICAgIHsKICAgICAg
ICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKCZvYmplY3Qs
IG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbygm
b2JqZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7CiAgICAgfQogCiBwcml2YXRlOgorICAgIC8vIFRo
aXMgY2xhc3Mga2VlcHMgYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgcGFzdCBuIGxvY2F0aW9ucyBm
b3IgYW4gSW5saW5lSXRlcmF0b3IuCisgICAgY2xhc3MgSW5saW5lSXRlcmF0b3JIaXN0b3J5IDog
cHJpdmF0ZSBWZWN0b3I8SW5saW5lSXRlcmF0b3IsIDE+IHsKKyAgICBwdWJsaWM6CisgICAgICAg
IElubGluZUl0ZXJhdG9ySGlzdG9yeSgpID0gZGVsZXRlOworICAgICAgICBJbmxpbmVJdGVyYXRv
ckhpc3RvcnkoY29uc3QgSW5saW5lSXRlcmF0b3ImIGluaXRpYWwsIHNpemVfdCBjYXBhY2l0eSkK
KyAgICAgICAgICAgIDogbV9jYXBhY2l0eShjYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAg
ICAgQVNTRVJUKGNhcGFjaXR5ID4gMCk7CisgICAgICAgICAgICB0aGlzLT5hcHBlbmQoaW5pdGlh
bCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHB1c2goc3RkOjpmdW5jdGlvbjx2b2lkKElu
bGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAg
IEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9
IDEpCisgICAgICAgICAgICAgICAgdGhpcy0+aW5zZXJ0KDAsIElubGluZUl0ZXJhdG9yKHRoaXMt
PmF0KDApKSk7CisgICAgICAgICAgICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKKyAgICAgICAgICAg
IGlmIChtX2NhcGFjaXR5ICE9IDEpCisgICAgICAgICAgICAgICAgdGhpcy0+cmVzaXplKG1fY2Fw
YWNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGUoc3RkOjpmdW5jdGlvbjx2
b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHVwZGF0ZXIodGhp
cy0+YXQoMCkpOworICAgICAgICB9CisKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlcigp
IGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLnJlbmRlcmVyKCk7IH0KKyAgICAgICAgdW5zaWdu
ZWQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkub2Zmc2V0KCk7IH0KKyAgICAg
ICAgYm9vbCBhdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVybiB0aGlzLT5h
dCgwKS5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKTsgfQorICAgICAgICBVQ2hhciBwcmV2aW91
c0luU2FtZU5vZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5wcmV2aW91c0luU2FtZU5v
ZGUoKTsgfQorICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgZ2V0KHNpemVfdCBpKSBjb25z
dCB7IHJldHVybiB0aGlzLT5hdChpKTsgfTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Im
IGN1cnJlbnQoKSBjb25zdCB7IHJldHVybiBnZXQoMCk7IH0KKyAgICAgICAgc2l6ZV90IGhpc3Rv
cnlMZW5ndGgoKSBjb25zdCB7IHJldHVybiB0aGlzLT5zaXplKCk7IH0KKworICAgICAgICB2b2lk
IG1vdmVUbyhSZW5kZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgbmV4dEJy
ZWFrID0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2goWyZdKElubGluZUl0ZXJhdG9y
JiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhvYmplY3QsIG9m
ZnNldCwgbmV4dEJyZWFrKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAg
dm9pZCBpbmNyZW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUoW10oSW5saW5l
SXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50
KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKQor
ICAgICAgICB7CisgICAgICAgICAgICBwdXNoKFtdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkg
eworICAgICAgICAgICAgICAgIG1vZGlmeU1lLmNsZWFyKCk7CisgICAgICAgICAgICB9KTsKKyAg
ICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1fY2FwYWNpdHk7
CisgICAgfTsKKwogICAgIExpbmVCcmVha2VyJiBtX2xpbmVCcmVha2VyOwogICAgIElubGluZUJp
ZGlSZXNvbHZlciYgbV9yZXNvbHZlcjsKIAogICAgIElubGluZUl0ZXJhdG9yIG1fY3VycmVudDsK
LSAgICBJbmxpbmVJdGVyYXRvciBtX2xpbmVCcmVhazsKKyAgICBJbmxpbmVJdGVyYXRvckhpc3Rv
cnkgbV9saW5lQnJlYWtIaXN0b3J5OwogICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXM7CiAKICAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CkBAIC0yMjgsOCArMjkx
LDEwIEBAIGlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVh
cikKIHsKICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkpIHsKICAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBiciA9IG1fY3VycmVudC5yZW5kZXJlcigpOwotICAgICAgICBtX2xpbmVCcmVhay5tb3Zl
VG9TdGFydE9mKGJyKTsKLSAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAg
IG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsK
KyAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUb1N0YXJ0T2YoYnIpOworICAgICAgICAgICAgbW9k
aWZ5TWUuaW5jcmVtZW50KCk7CisgICAgICAgIH0pOwogCiAgICAgICAgIC8vIEEgPGJyPiBhbHdh
eXMgYnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAogICAg
ICAgICAvLyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBh
IDxicj4gZG9lcyBub3QKQEAgLTM1MCw5ICs0MTUsOSBAQCBpbmxpbmUgdm9pZCBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUZsb2F0KCkKICAgICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8gbmV4dCBsaW5l
IChpbiBjbGVhckZsb2F0cygpIGZ1bmMpCiAgICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYmIG1f
d2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2lj
YWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKICAgICAgICAgbV9saW5lQnJlYWtl
ci5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOwotICAgICAgICBpZiAobV9saW5lQnJl
YWsucmVuZGVyZXIoKSA9PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgewotICAgICAgICAgICAgQVNT
RVJUKCFtX2xpbmVCcmVhay5vZmZzZXQoKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNy
ZW1lbnQoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpID09IG1f
Y3VycmVudC5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJyZWFrSGlz
dG9yeS5vZmZzZXQoKSk7CisgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50
KCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgbV9mbG9hdHNGaXRPbkxpbmUgPSBm
YWxzZTsKQEAgLTQ4OSwyOCArNTU0LDI4IEBAIGlubGluZSB2b2lkIHVwZGF0ZUNvdW50ZXJJZk5l
ZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQogICAgIGRvd25jYXN0PFJlbmRlckNvdW50ZXI+
KHJlbmRlclRleHQpLnVwZGF0ZUNvdW50ZXIoKTsKIH0KIAotaW5saW5lIGZsb2F0IG1lYXN1cmVI
eXBoZW5XaWR0aChSZW5kZXJUZXh0KiByZW5kZXJlciwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQs
IEhhc2hTZXQ8Y29uc3QgRm9udCo+KiBmYWxsYmFja0ZvbnRzID0gMCkKK2lubGluZSBmbG9hdCBt
ZWFzdXJlSHlwaGVuV2lkdGgoUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGNvbnN0IEZvbnRDYXNjYWRl
JiBmb250LCBIYXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cyA9IDApCiB7Ci0gICAg
Y29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJu
IGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQs
IHN0eWxlLmh5cGhlblN0cmluZygpLnN0cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOwor
ICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRlcmVyLnN0eWxlKCk7CisgICAgcmV0
dXJuIGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnJlbmRlcmVyLCBm
b250LCBzdHlsZS5oeXBoZW5TdHJpbmcoKS5zdHJpbmcoKSwgc3R5bGUpLCBmYWxsYmFja0ZvbnRz
KTsKIH0KIAotQUxXQVlTX0lOTElORSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwg
dW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgZmxv
YXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNo
U2V0PGNvbnN0IEZvbnQqPiYgZmFsbGJhY2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gMCkK
K0FMV0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQmIHRleHQsIHVuc2lnbmVk
IGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGZsb2F0IHhQb3Ms
IGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxjb25z
dCBGb250Kj4mIGZhbGxiYWNrRm9udHMsIFRleHRMYXlvdXQqIGxheW91dCA9IG51bGxwdHIpCiB7
Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKyAgICBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LnN0eWxlKCk7CiAKICAgICBHbHlwaE92ZXJmbG93
IGdseXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09
IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENvbWJpbmUoKSkKLSAgICAgICAg
cmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9udHMs
ICZnbHlwaE92ZXJmbG93KTsKKyAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4g
PT0gdGV4dC50ZXh0TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkpCisgICAgICAg
IHJldHVybiB0ZXh0LndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9udHMs
ICZnbHlwaE92ZXJmbG93KTsKIAogICAgIGlmIChsYXlvdXQpCiAgICAgICAgIHJldHVybiBGb250
Q2FzY2FkZTo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7CiAKLSAg
ICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQs
IHRleHQsIGZyb20sIGxlbiwgc3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRl
eHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOworICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6
OmNvbnN0cnVjdFRleHRSdW4oJnRleHQsIGZvbnQsICZ0ZXh0LCBmcm9tLCBsZW4sIHN0eWxlKTsK
KyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LnRleHRMZW5ndGgoKSAtIGZyb20pOwog
ICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CiAKLSAg
ICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNvZGVQYXRoKCF0ZXh0LT5jYW5Vc2VTaW1wbGVGb250
Q29kZVBhdGgoKSk7CisgICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC5j
YW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7CiAgICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNl
V2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKICAgICBydW4uc2V0WFBvcyh4UG9zKTsKICAg
ICByZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7
CkBAIC01MjQsNyArNTg5LDcgQEAgaW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVC
b3goTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmwKICAgICBsaW5lTWlk
cG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFn
cmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNldCgp
KSk7CiB9CiAKLWlubGluZSB2b2lkIHRyeUh5cGhlbmF0aW5nKFJlbmRlclRleHQqIHRleHQsIGNv
bnN0IEZvbnRDYXNjYWRlJiBmb250LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZp
ZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50IG1pbmltdW1T
dWZmaXhMaW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZsb2F0IHhQb3Ms
IGludCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0
ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJl
YWssIGludCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5hdGVkKQoraW5saW5lIHZvaWQgdHJ5
SHlwaGVuYXRpbmcoUmVuZGVyVGV4dCYgdGV4dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNv
bnN0IEF0b21pY1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQg
bWluaW11bVByZWZpeExpbWl0LCBpbnQgbWluaW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0
U3BhY2UsIHVuc2lnbmVkIHBvcywgZmxvYXQgeFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29s
IGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3Jk
U3BhY2luZywgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJv
b2wmIGh5cGhlbmF0ZWQpCiB7CiAgICAgLy8gTWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxh
ZnRlcn06IGF1dG87JyB0byAyLgogICAgIHVuc2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7CkBA
IC01NTQsOSArNjE5LDkgQEAgaW5saW5lIHZvaWQgdHJ5SHlwaGVuYXRpbmcoUmVuZGVyVGV4dCog
dGV4dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNvbnN0IEF0b20KICAgICBpZiAobWF4UHJl
Zml4V2lkdGggPD0gZm9udC5waXhlbFNpemUoKSAqIDUgLyA0KQogICAgICAgICByZXR1cm47CiAK
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOwotICAgIFRleHRS
dW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dCwg
bGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIHN0eWxlKTsKLSAgICBydW4uc2V0Q2hhcmFjdGVy
c0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBsYXN0U3BhY2UpOworICAgIGNvbnN0IFJlbmRl
clN0eWxlJiBzdHlsZSA9IHRleHQuc3R5bGUoKTsKKyAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJs
b2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZ0ZXh0LCBmb250LCAmdGV4dCwgbGFzdFNwYWNlLCBwb3Mg
LSBsYXN0U3BhY2UsIHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LnRl
eHRMZW5ndGgoKSAtIGxhc3RTcGFjZSk7CiAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3Ro
KCkgPj0gcnVuLmxlbmd0aCgpKTsKIAogICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRl
U3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CkBAIC01NjYsMTQgKzYzMSwxNCBAQCBpbmxpbmUgdm9p
ZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250Q2FzY2FkZSYgZm9u
dCwgY29uc3QgQXRvbQogICAgIGlmIChwcmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3Ro
KQogICAgICAgICByZXR1cm47CiAKLSAgICBwcmVmaXhMZW5ndGggPSBsYXN0SHlwaGVuTG9jYXRp
b24oU3RyaW5nVmlldyh0ZXh0LT50ZXh0KCkpLnN1YnN0cmluZyhsYXN0U3BhY2UsIHBvcyAtIGxh
c3RTcGFjZSksIHN0ZDo6bWluKHByZWZpeExlbmd0aCwgcG9zIC0gbGFzdFNwYWNlIC0gbWluaW11
bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJZGVudGlmaWVyKTsKKyAgICBwcmVmaXhMZW5ndGgg
PSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyh0ZXh0LnRleHQoKSkuc3Vic3RyaW5nKGxh
c3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlKSwgc3RkOjptaW4ocHJlZml4TGVuZ3RoLCBwb3MgLSBs
YXN0U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50aWZpZXIpOwog
ICAgIGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5n
dGgpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFdoZW4gbGFzdFNwYWNlIGlzIGEgc3BhY2Us
IHdoaWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2Yg
YSBsaW5lIG9yIGFmdGVyIGNvbGxhcHNlZAogICAgIC8vIHNwYWNlLCBpdCBzaG91bGQgbm90IGNv
dW50IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KICAgICBpZiAocHJlZml4TGVuZ3Ro
ID09IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKLSAgICAgICAgVUNoYXIgY2hhcmFjdGVyQXRMYXN0
U3BhY2UgPSB0ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOworICAgICAgICBVQ2hhciBjaGFy
YWN0ZXJBdExhc3RTcGFjZSA9IHRleHQuY2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKICAgICAgICAg
aWYgKGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9
PSAnXG4nIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVyQXRMYXN0
U3BhY2UgPT0gbm9CcmVha1NwYWNlKQogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTU4
OCw3ICs2NTMsNyBAQCBpbmxpbmUgdm9pZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0
LCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgY29uc3QgQXRvbQogICAgIFVOVVNFRF9QQVJBTShp
c0ZpeGVkUGl0Y2gpOwogI2VuZGlmCiAKLSAgICBsaW5lQnJlYWsubW92ZVRvKHRleHQsIGxhc3RT
cGFjZSArIHByZWZpeExlbmd0aCwgbmV4dEJyZWFrYWJsZSk7CisgICAgbGluZUJyZWFrLm1vdmVU
bygmdGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWthYmxlKTsKICAgICBo
eXBoZW5hdGVkID0gdHJ1ZTsKIH0KIApAQCAtNjEwLDkgKzY3NSw5IEBAIGlubGluZSBib29sIEJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1l
bnRzLCBib29sCiAgICAgICAgIGF1dG8mIGNvbWJpbmVSZW5kZXJlciA9IGRvd25jYXN0PFJlbmRl
ckNvbWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOwogICAgICAgICBjb21iaW5lUmVu
ZGVyZXIuY29tYmluZVRleHQoKTsKICAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVy
ZXIncyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3Np
dGlvbnMKLSAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0
KG1fbGluZUJyZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7CisgICAgICAgIGlmIChpdGVyYXRvcklz
QmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgp
LCBjb21iaW5lUmVuZGVyZXIpKSB7CiAgICAgICAgICAgICBBU1NFUlQoaXRlcmF0b3JJc0JleW9u
ZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBjb21iaW5lUmVu
ZGVyZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAg
ICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwogICAgICAgICAgICAgbV9yZXNvbHZl
ci5pbmNyZW1lbnQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY3NCw3ICs3MzksNyBAQCBpbmxp
bmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29y
ZE1lYXN1cmVtZW50cywgYm9vbAogICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxz
ZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKIAogICAgICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYm
IG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5z
Tm9uZSkgewotICAgICAgICAgICAgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgoJnJl
bmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgICAgIGh5cGhlbldpZHRo
ID0gbWVhc3VyZUh5cGhlbldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsK
ICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7CiAg
ICAgICAgIH0KIApAQCAtNjg1LDcgKzc1MCw3IEBAIGlubGluZSBib29sIEJyZWFraW5nQ29udGV4
dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAg
ICAgICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAo
IW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9X
UkFQKSkgewogICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOwogICAgICAgICAgICAgYm9v
bCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBt
X2N1cnJlbnQub2Zmc2V0KCkgKyAxIDwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lT
X1RSQUlMKHJlbmRlclRleHRbbV9jdXJyZW50Lm9mZnNldCgpICsgMV0pOwotICAgICAgICAgICAg
Y2hhcldpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zmc2V0KCksIG1p
ZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNv
bW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisgICAgICAgICAgICBjaGFyV2lkdGggPSB0
ZXh0V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJyZW50Lm9mZnNldCgpLCBtaWRXb3JkQnJlYWtJc0Jl
Zm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgp
ICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9u
dHMsIHRleHRMYXlvdXQpOwogICAgICAgICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21t
aXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRo
KCk7CiAgICAgICAgIH0KIApAQCAtNzIyLDkgKzc4Nyw5IEBAIGlubGluZSBib29sIEJyZWFraW5n
Q29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBi
b29sCiAKICAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGg7CiAgICAgICAgICAg
ICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjID09ICcgJykKLSAgICAgICAgICAgICAg
ICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBsYXN0U3BhY2Us
IG1fY3VycmVudC5vZmZzZXQoKSArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGg7
CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJU
ZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSArIDEgLSBsYXN0U3BhY2UsIGZvbnQs
IG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3Bh
Y2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFp
bGluZ1NwYWNlV2lkdGg7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRkaXRp
b25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aCgmcmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJl
bnQub2Zmc2V0KCkgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlz
Rml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFj
a0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRo
ID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpIC0g
bGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1f
Y29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExh
eW91dCk7CiAKICAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5p
c0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIHdv
cmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7CkBAIC03NTIs
NyArODE3LDcgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRN
ZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAgICAgICAgICAvLyBh
cyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KICAgICAgICAgICAgICAgICBib29sIGxp
bmVXYXNUb29XaWRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1fd2lkdGguZml0c09u
TGluZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzV1MgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFr
T25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgICAg
ICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKCZyZW5kZXJUZXh0LCBtX2N1cnJlbnQu
b2Zmc2V0KCksIDEsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwg
bV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0
TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAg
ICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3Vy
cmVudC5vZmZzZXQoKSwgMSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBp
dGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMs
IHRleHRMYXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwogICAg
ICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0
IHRoZSBleHRyYSBzcGFjZQogICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRo
ZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIC8v
IElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLApA
QCAtNzYwLDMwICs4MjUsMzQgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVU
ZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAgICAg
ICAgICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgogICAgICAgICAgICAgICAgICAgICBp
ZiAoIW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBt
X2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBUcmFpbGluZ1doaXRlc3Bh
Y2UobV9saW5lQnJlYWssIG1fbGluZUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhtX2N1cnJlbnQucmVuZGVy
ZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9u
KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrZXIuc2tpcFRyYWls
aW5nV2hpdGVzcGFjZShtb2RpZnlNZSwgbV9saW5lSW5mbyk7CisgICAgICAgICAgICAgICAgICAg
ICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0c09uTGluZSgpKSB7
CiAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1fd2lkdGguZml0c09u
TGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGluZygmcmVuZGVy
VGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBt
X2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9uTGlt
aXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwgbV9j
dXJyZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBX
aWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VX
aGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5u
ZXh0QnJlYWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworICAg
ICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0
ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeUh5cGhl
bmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5o
eXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBs
YXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFk
ZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNo
LCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBt
X2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5h
dGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKSB7CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9hdEVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhay5hdFRleHRQYXJhZ3JhcGhT
ZXBhcmF0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5
LmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkgPiAwKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGlu
ZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xp
bmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFr
SGlzdG9yeS5pbmNyZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUluZm8u
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNldCgpOworICAg
ICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJy
ZWFrSGlzdG9yeS5vZmZzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICBpZiAobV9saW5lQnJlYWsub2Zmc2V0KCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4o
bV9saW5lQnJlYWsucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJy
ZWFrLnJlbmRlcmVyKCkpLnRleHRMZW5ndGgoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9s
aW5lQnJlYWsucmVuZGVyZXIoKSkuY2hhcmFjdGVyQXQobV9saW5lQnJlYWsub2Zmc2V0KCkgLSAx
KSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAmJiBkb3duY2Fz
dDxSZW5kZXJUZXh0PihtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8
UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS50ZXh0TGVuZ3RoKCkg
JiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS5j
aGFyYWN0ZXJBdChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkgLSAxKSA9PSBzb2Z0SHlwaGVu
ICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKICAgICAgICAgICAgICAgICAgICAg
ICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJl
YWsub2Zmc2V0KCkgJiYgbV9saW5lQnJlYWsub2Zmc2V0KCkgIT0gKHVuc2lnbmVkKXdvcmRNZWFz
dXJlbWVudC5lbmRPZmZzZXQgJiYgIXdvcmRNZWFzdXJlbWVudC53aWR0aCkgeworICAgICAgICAg
ICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpICYmIG1fbGluZUJyZWFr
SGlzdG9yeS5vZmZzZXQoKSAhPSAodW5zaWduZWQpd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCAm
JiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
Y2hhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50
LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVha0hpc3Rvcnkub2Zm
c2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRo
ID0gY2hhcldpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
ICAgICB9CkBAIC04MDcsNyArODc2LDcgQEAgaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0Ojpo
YW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAg
ICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0
KCkpCiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGlu
ZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CiAgICAgICAgICAgICAgICAgY29tbWl0TGluZUJy
ZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0
KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAg
bV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0
b3J5LmluY3JlbWVudCgpOwogICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KHRydWUpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAg
ICAgICAgICAgfQpAQCAtODIzLDcgKzg5Miw3IEBAIGlubGluZSBib29sIEJyZWFraW5nQ29udGV4
dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAg
ICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dF
VF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7CiAgICAgICAgICAgICAgICAgLy8gUmVtZW1i
ZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCiAgICAgICAgICAgICAgICAg
Ly8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0gICAgICAgICAgICAgICAg
bV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0
KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAg
bV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50
Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOwogICAgICAgICAg
ICAgICAgIG1pZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7CiAgICAgICAg
ICAgICB9CiAKQEAgLTg3OSw3ICs5NDgsNyBAQCBpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6
OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbAogCiAg
ICAgICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBwcmV2aW91c0NoYXJhY3Rlcklz
V1MpIHsKICAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5icmVh
a09ubHlBZnRlcldoaXRlU3BhY2UoKSkKLSAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3Zl
VG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5l
eHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3Rv
cnkubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3Vy
cmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAo
bV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9p
Z25vcmluZ1NwYWNlcykKQEAgLTg5OCw3ICs5NjcsNyBAQCBpbmxpbmUgYm9vbCBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9v
bAogICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OwogCiAgICAgLy8g
SU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgZmxvYXQgYWRk
aXRpb25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKCZyZW5k
ZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwgZm9udCwg
bV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgIGZsb2F0
IGFkZGl0aW9uYWxUZW1wV2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aChy
ZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwgZm9u
dCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVT
cGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwogICAgIHdv
cmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKICAgICB3b3JkTWVhc3VyZW1l
bnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOwogICAgIHdvcmRNZWFzdXJlbWVudC53
aWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRT
cGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwpAQCAtOTE3LDEwICs5ODYsMTMgQEAgaW5saW5lIGJv
b2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMsIGJvb2wKICAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwogCiAgICAgaWYg
KCFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewotICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQotICAg
ICAgICAgICAgdHJ5SHlwaGVuYXRpbmcoJnJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgp
LCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGlt
aXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5j
dXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lk
dGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNw
YWNpbmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1f
bGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSkgewor
ICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBt
b2RpZnlNZSkgeworICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZv
bnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0
eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3Jl
KCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5v
ZmZzZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1f
d2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJs
ZVBvc2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgIH0p
OworICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGluZUJyZWFrLnBy
ZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5
cGhlbnNOb25lKSB7CisgICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVha0hpc3Rv
cnkucHJldmlvdXNJblNhbWVOb2RlKCkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkg
IT0gSHlwaGVuc05vbmUpIHsKICAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwogICAgICAg
ICAgICAgbV9hdEVuZCA9IHRydWU7CiAgICAgICAgIH0KQEAgLTEwMDgsMTMgKzEwODAsMTIgQEAg
aW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5l
ZWRlZCgpCiAKICAgICBpZiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc0Zsb2F0aW5nT3JPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpIHsKICAgICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJyZW50LnJl
bmRlcmVyKCk7Ci0gICAgICAgIGlmIChtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSAmJiBtX2F1
dG9XcmFwICYmICFtX2xhc3RPYmplY3QtPmlzUnVieVJ1bigpICYmICghbV9sYXN0T2JqZWN0LT5p
c0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghaXM8UmVuZGVyTGlzdE1hcmtl
cj4oKm1fbGFzdE9iamVjdCkgfHwgZG93bmNhc3Q8UmVuZGVyTGlzdE1hcmtlcj4oKm1fbGFzdE9i
amVjdCkuaXNJbnNpZGUoKSkpIHsKKyAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBsYWNl
ZCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fbGFzdE9iamVjdC0+aXNSdWJ5UnVuKCkgJiYgKCFtX2xh
c3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFpczxSZW5k
ZXJMaXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KSB8fCBkb3duY2FzdDxSZW5kZXJMaXN0TWFya2Vy
PigqbV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkKICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVh
a0F0Q3VycmVudFdpZHRoKCptX25leHRPYmplY3QpOwotICAgICAgICB9CiAgICAgfQogfQogCi1p
bmxpbmUgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjaGVja01pZHBv
aW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9y
JiBsQnJlYWspCitpbmxpbmUgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2VPck5v
dCBjaGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBsQnJlYWspCiB7CiAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91
ciBsYXN0IG1pZHBvaW50IGlzIGEgc3RhcnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJyZWFrLiBJ
ZiBzbywKICAgICAvLyBzaGF2ZSBpdCBvZmYgdGhlIGxpc3QsIGFuZCBzaGF2ZSBvZmYgYSB0cmFp
bGluZyBzcGFjZSBpZiB0aGUgcHJldmlvdXMgZW5kIHBvaW50IGRvZXNuJ3QKQEAgLTEwNDAsMTIg
KzExMTEsMTIgQEAgaW5saW5lIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JO
b3QgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBvaW50U3RhdGUKIAogaW5saW5lIElubGluZUl0ZXJh
dG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKIHsKLSAgICBpZiAobV9saW5l
QnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7Ci0gICAgICAgIGlmICghbV9saW5lQnJl
YWsucmVuZGVyZXIoKSB8fCAhbV9saW5lQnJlYWsucmVuZGVyZXIoKS0+aXNCUigpKSB7CisgICAg
aWYgKG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCkgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigp
KSB7CisgICAgICAgIGlmICghbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkgfHwgIW1fbGlu
ZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpLT5pc0JSKCkpIHsKICAgICAgICAgICAgIC8vIHdlIGp1
c3QgYWRkIGFzIG11Y2ggYXMgcG9zc2libGUKICAgICAgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUu
d2hpdGVTcGFjZSgpID09IFBSRSAmJiAhbV9jdXJyZW50Lm9mZnNldCgpKQogICAgICAgICAgICAg
ICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2xhc3RPYmplY3QsIG1fbGFzdE9i
amVjdC0+aXNUZXh0KCkgPyBtX2xhc3RPYmplY3QtPmxlbmd0aCgpIDogMCk7Ci0gICAgICAgICAg
ICBlbHNlIGlmIChtX2xpbmVCcmVhay5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBlbHNlIGlm
IChtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSkgewogICAgICAgICAgICAgICAgIC8vIERv
bid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQu
CiAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFsbC4gV2UganVzdCBoYXZl
IHRvIGJlIG9uIHRoaXMgbGluZSwKICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSds
bCBzcGlsbCBvdXQuCkBAIC0xMDUzLDMxICsxMTI0LDY2IEBAIGlubGluZSBJbmxpbmVJdGVyYXRv
ciBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIv
b2JqZWN0LgotICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigp
KQotICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgIGlmIChtX2xp
bmVCcmVha0hpc3RvcnkuY3VycmVudCgpID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAg
ICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKICAgICB9IGVsc2UgaWYgKCFt
X2N1cnJlbnQub2Zmc2V0KCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dpZHRo
LnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVu
dCkgewogICAgICAgICAvLyBEbyBub3QgcHVzaCB0aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIG5l
eHQgbGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNvbWUgY29udGVudCwgYnV0IGl0IGlzIHN0aWxs
IGNvbnNpZGVyZWQgZW1wdHkuCiAgICAgICAgIC8vIEVtcHR5IGlubGluZSBlbGVtZW50cyBsaWtl
IDxzcGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBhbmQgbm93IHdlIGp1c3QgaWdu
b3JlIHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKICAgICAgICAgLy8gYXQgdGhlIHN0YXJ0IG9m
IGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHlldC4KICAgICAgICAgLy8g
QmVoYXZlIGFzIGlmIGl0IHdhcyBhY3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBv
bmUgb2JqZWN0LgotICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgbV9s
aW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwogICAgIH0KIAogICAgIC8vIFNhbml0eSBjaGVj
ayBvdXIgbWlkcG9pbnRzLgotICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNl
T3JOb3QgY29sbGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9s
aW5lQnJlYWspOworICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3Qg
Y29sbGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJl
YWtIaXN0b3J5LmN1cnJlbnQoKSk7CiAKLSAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRw
b2ludHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrLCBj
b2xsYXBzZWQpOworICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWls
aW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQo
KSwgY29sbGFwc2VkKTsKIAogICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4g
aXRlcmF0b3IgdGhhdCBwb2ludHMgcGFzdCB0aGUgZW5kCiAgICAgLy8gb2YgdGhlIG9iamVjdC4g
RG8gdGhpcyBhZGp1c3RtZW50IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0CiAgICAgLy8g
b2YgdGhlIG5leHQgb2JqZWN0IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9m
IHRoZQogICAgIC8vIGNvZGUuCi0gICAgaWYgKG1fbGluZUJyZWFrLm9mZnNldCgpKSB7Ci0gICAg
ICAgIG1fbGluZUJyZWFrLnNldE9mZnNldChtX2xpbmVCcmVhay5vZmZzZXQoKSAtIDEpOwotICAg
ICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5
Lm9mZnNldCgpKSB7CisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS51cGRhdGUoW10oSW5saW5l
SXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICBtb2RpZnlNZS5zZXRPZmZzZXQobW9k
aWZ5TWUub2Zmc2V0KCkgLSAxKTsKKyAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVudCgpOwor
ICAgICAgICB9KTsKICAgICB9CiAKLSAgICByZXR1cm4gbV9saW5lQnJlYWs7CisjaWYgRU5BQkxF
KENTU19UUkFJTElOR19XT1JEKQorICAgIGlmIChtX2Jsb2NrU3R5bGUudHJhaWxpbmdXb3JkKCkg
PT0gVHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNlZCkgeworICAgICAgICBJbmxpbmVJdGVy
YXRvciBsaW5lQnJlYWsgPSBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOworICAgICAgICBp
ZiAobGluZUJyZWFrLnJlbmRlcmVyKCkgJiYgbV9saW5lSW5mby5pc0ZpcnN0TGluZSgpICYmICFi
aWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKCpsaW5lQnJlYWsucm9vdCgpLCBsaW5lQnJlYWsu
cmVuZGVyZXIoKSkgJiYgaXM8UmVuZGVyVGV4dD4obGluZUJyZWFrLnJlbmRlcmVyKCkpKSB7Cisg
ICAgICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4o
KmxpbmVCcmVhay5yZW5kZXJlcigpKTsKKyAgICAgICAgICAgIC8vIERvbid0IGV2ZW4gYm90aGVy
IG1lYXN1cmluZyBpZiBvdXIgcmVtYWluaW5nIGxpbmUgaGFzIG1hbnkgY2hhcmFjdGVycworICAg
ICAgICAgICAgaWYgKHJlbmRlclRleHQudGV4dExlbmd0aCgpID09IGxpbmVCcmVhay5vZmZzZXQo
KSB8fCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAtIGxpbmVCcmVhay5vZmZzZXQoKSA+IDIwKQor
ICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQnJlYWs7CisgICAgICAgICAgICBib29sIGlzTG9v
c2VDSktNb2RlID0gbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgIT0gJnJlbmRlclRleHQgJiYgbV9y
ZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLmlzTG9vc2VDSktNb2RlKCk7CisgICAg
ICAgICAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPm5i
c3BNb2RlKCkgPT0gU1BBQ0U7CisgICAgICAgICAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9u
ID0gbGluZUJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbigpOworICAgICAgICAgICAgaXNCcmVh
a2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBsaW5lQnJlYWsub2Zm
c2V0KCkgKyAxLCBuZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCwgaXNMb29zZUNKS01v
ZGUpOworICAgICAgICAgICAgaWYgKG5leHRCcmVha2FibGVQb3NpdGlvbiA8IDAgfHwgc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KG5leHRCcmVha2FibGVQb3NpdGlvbikgIT0gcmVuZGVyVGV4dC50ZXh0
TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVCcmVhazsKKyAgICAgICAgICAg
IGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZShyZW5kZXJUZXh0LCBtX2xpbmVJ
bmZvKTsKKyAgICAgICAgICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUuZm9udENh
c2NhZGUoKTsKKyAgICAgICAgICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGR1bW15Rm9udHM7Cisg
ICAgICAgICAgICBJbmxpbmVJdGVyYXRvciBiZXN0ID0gbGluZUJyZWFrOworICAgICAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDE7IGkgPCBtX2xpbmVCcmVha0hpc3RvcnkuaGlzdG9yeUxlbmd0aCgp
OyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2FuZGlkYXRl
ID0gbV9saW5lQnJlYWtIaXN0b3J5LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlk
YXRlLnJlbmRlcmVyKCkgIT0gbGluZUJyZWFrLnJlbmRlcmVyKCkpCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBiZXN0OworICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gdGV4dFdpZHRo
KHJlbmRlclRleHQsIGNhbmRpZGF0ZS5vZmZzZXQoKSwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkg
LSBjYW5kaWRhdGUub2Zmc2V0KCksIGZvbnQsIDAsIGZvbnQuaXNGaXhlZFBpdGNoKCksIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCBkdW1teUZvbnRzKTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGgg
PiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBi
ZXN0OworICAgICAgICAgICAgICAgIGlmICh3aWR0aCAvIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgo
KSA+IDAuMSkgLy8gU3Vic2VxdWVudCBsaW5lIGlzIGxvbmcgZW5vdWdoCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBjYW5kaWRhdGU7CisgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICB9Cisg
ICAgfQorI2VuZGlmCisgICAgcmV0dXJuIG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7CiB9
CiAKIH0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0No
YW5nZUxvZwppbmRleCBjNDQ3M2JjYmFhZWRiZjU0NjgzYTJkNTUyYjMyNzY2MDljYTE3ZTdkLi5h
N2JiODg1MzM4ZGMyNjFhZjU1MzE1OTY3YWVlNDJlY2IxYzhkYTU1IDEwMDY0NAotLS0gYS9MYXlv
dXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEs
MTMgQEAKKzIwMTUtMDMtMDMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNv
bT4KKworICAgICAgICBJbXBsZW1lbnQgLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0
aWFsbHktYmFsYW5jZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0MjI1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRtbDogQWRkZWQuCisg
ICAgICAgICogZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbDogQWRkZWQuCisKIDIwMTUtMDMt
MDMgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAKICAgICAgICAgW1dpbl0g
RG9jdW1lbnQgbW9yZSBkZWJ1ZyBhc3NlcnRpb25zLgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMv
ZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3Qv
dGV4dC90cmFpbGluZy13b3JkLWV4cGVjdGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjYwMjRhZGI1NzNi
Zjc5YjAyYWY0NjFlYmY3NjhlNGE4YzQxYWEzZQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRl
c3RzL2Zhc3QvdGV4dC90cmFpbGluZy13b3JkLWV4cGVjdGVkLmh0bWwKQEAgLTAsMCArMSwxNSBA
QAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPC9oZWFkPgorPGJvZHk+CitUaGlz
IHRlc3QgbWFrZXMgc3VyZSB0aGF0IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlh
bGx5LWJhbGFuY2VkIGJyZWFrcyBsaW5lcyBjb3JyZWN0bHkuCis8ZGl2IHN0eWxlPSJmb250LWZh
bWlseTogQWhlbTsiPgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJD
IERFRiBHSEkgSktMPGJyPk1OTzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMg
VFVWVyBYWVogQUJDIERFRiBHSEk8YnI+SktMIE1OTzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBK
S0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBHIEg8YnI+SSBKIEs8L2Rpdj4KKzxkaXY+QUJD
IERFRiBHSEkgSktMIE1OTyBQUVJTIFRVVlcgWFlaIEFCQyBERUYgR0hJIEpLTDxicj5NTk8gUFFS
UzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJDIERFRiBH
SEkgSktMPGJyPk1OTyBQUVJTIFRVViBXWFlaIEFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVY8
YnI+V1hZWjwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9MYXlv
dXRUZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC90
ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMDgyNGU1NGU1ZGFiZjBmOTJmODhl
NmJmYjNhM2Q1MGM5MDlkODM4Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC90
ZXh0L3RyYWlsaW5nLXdvcmQuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgaHRtbD4K
KzxodG1sPgorPGhlYWQ+Cis8L2hlYWQ+Cis8Ym9keT4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRo
YXQgLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQgYnJlYWtz
IGxpbmVzIGNvcnJlY3RseS4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBBaGVtOyI+Cis8ZGl2
PkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PPC9k
aXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1i
YWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBK
S0wgTU5PPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBh
cnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMg
REVGIEcgSCBJIEogSzwvZGl2PgorPGRpdiBzdHlsZT0iLWFwcGxlLXRyYWlsaW5nLXdvcmQ6IC1h
cHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQ7Ij5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBY
WVogQUJDIERFRiBHSEkgSktMIE1OTyBQUVJTPC9kaXY+Cis8ZGl2IHN0eWxlPSItYXBwbGUtdHJh
aWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYgR0hJIEpLTCBN
Tk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWIFdYWVogQUJDIERF
RiBHSEkgSktMIE1OTyBQUVJTIFRVViBXWFlaPC9kaXY+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRt
bD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247882</attachid>
            <date>2015-03-04 12:41:09 -0800</date>
            <delta_ts>2015-03-04 12:43:21 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142253-20150304124050.patch</filename>
            <type>text/plain</type>
            <size>26987</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgxMDA4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmQ1NzM5MjFkZTEwZTI0
MDlmYTY2NTBlNTJhMTY1YWQxNGZkZWQ4Zi4uODkwMGFlMmZiNDA3ZDRiODYwM2Q0YzA1ZjVlNDc1
NTM3NmE2YTc3MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU1IEBACisyMDE1LTAzLTA0ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgSW1wbGVtZW50
IC1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDIyNTMKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGltcGxl
bWVudHMgYSBoaXN0b3J5IG1lY2hhbmlzbSBmb3IgbGluZSBicmVha2luZy4gSW4gcGFydGljdWxh
ciwgdGhpcyBwYXRjaCBwYXJ0aXRpb25zCisgICAgICAgIHRoZSB1cGRhdGVzIHRvIHRoZSBjdXJy
ZW50IGxpbmUgYnJlYWtpbmcgbG9jYXRpb24gaW50byB0d28ga2luZHM6IGNvbmNlcHR1YWxseSBu
ZXcgYnJlYWtpbmcgbG9jYXRpb25zLAorICAgICAgICBhbmQgZml4dXBzIHRvIGV4aXN0aW5nIGxv
Y2F0aW9ucy4gVGhlbiwgdGhpcyBwYXRjaCByZW1lbWJlcnMgYWxsIHRoZSBmaXhlZCB1cCBicmVh
a2luZyBsb2NhdGlvbnMsIHVwCisgICAgICAgIHRvIGEgbWF4aW11bSBudW1iZXIgb2YgcmVtZW1i
ZXJlZCBsb2NhdGlvbnMuCisKKyAgICAgICAgVGhlIHBhdGNoIHRoZW4gdXNlcyB0aGlzIG1lbW9y
eSB0byBjaGFuZ2UgdGhlIGxpbmUtYnJlYWtpbmcgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBydWxl
cyBvZgorICAgICAgICAtYXBwbGUtdHJhaWxpbmctd29yZC4KKworICAgICAgICBUaGlzIHBhdGNo
IGFsc28gcGVyZm9ybXMgc29tZSBjbGVhbnVwIG9mIEJyZWFraW5nQ29udGV4dCwgdXNpbmcgbnVs
bHB0ciBpbnN0ZWFkIG9mIDAgYW5kIG1pZ3JhdGluZworICAgICAgICBub24tbnVsbCBwb2ludGVy
cyB0byByZWZlcmVuY2VzLgorCisgICAgICAgIFRlc3Q6IGZhc3QvdGV4dC90cmFpbGluZy13b3Jk
Lmh0bWwKKworICAgICAgICAqIHJlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhl
YWRlcnMuaDoKKyAgICAgICAgVXNlIElubGluZUl0ZXJhdG9ySGlzdG9yeSBhcyBhIHByb3h5IGZv
ciB0aGUgY3VycmVudCBicmVha2luZyBsb2NhdGlvbi4gTm90ZSB0aGF0IGFsbCB0aGVzZSBmdW5j
dGlvbnMKKyAgICAgICAgYXJlIGlubGluZWQsIHNvIHRoZSBvdmVyaGVhZCBzaG91bGQgYmUgbmV4
dCB0byBub3RoaW5nIHdoZW4gLWFwcGxlLXRyYWlsaW5nLXdvcmQgaXMgbm90IGluIHVzZS4KKyAg
ICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6QnJlYWtpbmdDb250ZXh0KTogVXNlIElu
bGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAgIChX
ZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVhayk6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6QnJlYWtpbmdDb250ZXh0OjpjbGVhckxpbmVCcmVha0lmRml0c09uTGluZSk6IERpdHRv
CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNvbW1pdExpbmVCcmVha0F0Q3Vy
cmVudFdpZHRoKTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5s
aW5lSXRlcmF0b3JIaXN0b3J5OjpJbmxpbmVJdGVyYXRvckhpc3RvcnkpOiBLZWVwcyB0cmFjayBv
ZiBoaXN0b3JpY2FsCisgICAgICAgIGJyZWFraW5nIGxvY2F0aW9ucworICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OnB1c2gpOiBSZW1lbWJl
ciBhIG5ldyBicmVha2luZyBsb2NhdGlvbgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250
ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OnVwZGF0ZSk6IFVwZGF0ZSBhbiBleGlzdGluZyBi
cmVha2luZyBsb2NhdGlvbgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxp
bmVJdGVyYXRvckhpc3Rvcnk6OnJlbmRlcmVyKTogRm9yd2FyZGVkIHRvIHRoZSBjdXJyZW50IGJy
ZWFraW5nIGxvY2F0aW9uCisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGlu
ZUl0ZXJhdG9ySGlzdG9yeTo6b2Zmc2V0KTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjphdFRleHRQYXJhZ3JhcGhTZXBhcmF0
b3IpOiAgRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRl
cmF0b3JIaXN0b3J5OjpwcmV2aW91c0luU2FtZU5vZGUpOiBEaXR0bworICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OmdldCk6IEdldCBvbmUg
b2YgdGhlIHJlbWVtYmVyZWQgYnJlYWtpbmcgbG9jYXRpb25zCisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6Y3VycmVudCk6IEdldCB0aGUg
Y3VycmVudCBicmVha2luZyBsb2NhdGlvbgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250
ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Omhpc3RvcnlMZW5ndGgpOgorICAgICAgICAoV2Vi
Q29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Om1vdmVUbyk6IEZv
cndhcmRlZCB0byB0aGUgY3VycmVudCBicmVha2luZyBsb2NhdGlvbi4KKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjppbmNyZW1lbnQpOiBE
aXR0bworICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhp
c3Rvcnk6OmNsZWFyKTogRGl0dG8KKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
aGFuZGxlQlIpOiBVc2UgSW5saW5lSXRlcmF0b3JIaXN0b3J5IGluc3RlYWQgb2YgSW5saW5lSXRl
cmF0b3IKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlRmxvYXQpOiBE
aXR0bworICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KTogVXNl
IElubGluZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVl
ZGVkKTogU3R5bGUKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrTWlkcG9pbnRzKTogVXNlIElubGlu
ZUl0ZXJhdG9ySGlzdG9yeSBpbnN0ZWFkIG9mIElubGluZUl0ZXJhdG9yCisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSk6IElmIC1hcHBsZS10cmFpbGlu
Zy13b3JkIGlzIGluIGVmZmVjdCwgdXNlCisgICAgICAgIG9wdGltYWxMaW5lQnJlYWtMb2NhdGlv
bkZvclRyYWlsaW5nV29yZCgpLgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpo
YW5kbGVFbmRPZkxpbmUpOiBVc2UgdGhlIHJlbWVtYmVyZWQgYnJlYWtpbmcgbG9jYXRpb25zIGFu
ZCBjaG9vc2UgdGhlIG9wdGltYWwKKyAgICAgICAgb25lLgorICAgICAgICAoV2ViQ29yZTo6QnJl
YWtpbmdDb250ZXh0OjpsaW5lQnJlYWtSZWYpOiBEZWxldGVkLgorCiAyMDE1LTAzLTA0ICBUaW1v
dGh5IEhvcnRvbiAgPHRpbW90aHlfaG9ydG9uQGFwcGxlLmNvbT4KIAogICAgICAgICA8YXR0YWNo
bWVudD4gdGl0bGUgdGV4dCBkaXNhcHBlYXJzIHdoZW4gZHJhZ2dpbmcKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMu
aCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhl
YWRlcnMuaAppbmRleCA3ZDkwZWNlZjcwMzVmMmQ5N2UxNWQ0NjQwY2QyMDgxNTdlMTRmZDEwLi45
ZWQ4ZjZiOWU5ZjcyYjFkMjFhNzQyZWJiMzcxMDJjNDYwYmUxNGNhIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5l
SGVhZGVycy5oCkBAIC02OCw3ICs2OCwxMSBAQCBwdWJsaWM6CiAgICAgICAgIDogbV9saW5lQnJl
YWtlcihsaW5lQnJlYWtlcikKICAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29sdmVyKQogICAgICAg
ICAsIG1fY3VycmVudChyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAgICAsIG1fbGluZUJyZWFr
KHJlc29sdmVyLnBvc2l0aW9uKCkpCisjaWYgRU5BQkxFKENTU19UUkFJTElOR19XT1JEKQorICAg
ICAgICAsIG1fbGluZUJyZWFrSGlzdG9yeShJbmxpbmVJdGVyYXRvcihyZXNvbHZlci5wb3NpdGlv
bigpKSwgYmxvY2suc3R5bGUoKS50cmFpbGluZ1dvcmQoKSA9PSBUcmFpbGluZ1dvcmQ6OlBhcnRp
YWxseUJhbGFuY2VkID8gNSA6IDEpCisjZWxzZQorICAgICAgICAsIG1fbGluZUJyZWFrSGlzdG9y
eShJbmxpbmVJdGVyYXRvcihyZXNvbHZlci5wb3NpdGlvbigpKSwgMSkKKyNlbmRpZgogICAgICAg
ICAsIG1fYmxvY2soYmxvY2spCiAgICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5yZW5k
ZXJlcigpKQogICAgICAgICAsIG1fbmV4dE9iamVjdChudWxscHRyKQpAQCAtMTAxLDggKzEwNSw3
IEBAIHB1YmxpYzoKICAgICB9CiAKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRPYmplY3QoKSB7
IHJldHVybiBtX2N1cnJlbnQucmVuZGVyZXIoKTsgfQotICAgIElubGluZUl0ZXJhdG9yIGxpbmVC
cmVhaygpIHsgcmV0dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgSW5saW5lSXRlcmF0b3ImIGxpbmVC
cmVha1JlZigpIHtyZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVyYXRvciBsaW5l
QnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOyB9CiAgICAgTGlu
ZVdpZHRoJiBsaW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9CiAgICAgYm9vbCBhdEVuZCgp
IHsgcmV0dXJuIG1fYXRFbmQ7IH0KIApAQCAtMTE5LDI1ICsxMjIsODggQEAgcHVibGljOgogICAg
IGJvb2wgY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpOwogICAgIHZvaWQgY29tbWl0QW5kVXBkYXRl
TGluZUJyZWFrSWZOZWVkZWQoKTsKICAgICBJbmxpbmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUo
KTsKKyNpZiBFTkFCTEUoQ1NTX1RSQUlMSU5HX1dPUkQpCisgICAgSW5saW5lSXRlcmF0b3Igb3B0
aW1hbExpbmVCcmVha0xvY2F0aW9uRm9yVHJhaWxpbmdXb3JkKCk7CisjZW5kaWYKIAogICAgIHZv
aWQgY2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2Ug
PSBmYWxzZSkKICAgICB7CiAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdU
cmFpbGluZ1NwYWNlKSB8fCBtX2xhc3RXUyA9PSBOT1dSQVApCi0gICAgICAgICAgICBtX2xpbmVC
cmVhay5jbGVhcigpOworICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmNsZWFyKCk7CiAg
ICAgfQogCiAgICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmpl
Y3QmIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQogICAg
IHsKICAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRv
KCZvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5
Lm1vdmVUbygmb2JqZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7CiAgICAgfQogCiBwcml2YXRlOgor
ICAgIC8vIFRoaXMgY2xhc3Mga2VlcHMgYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgcGFzdCBuIGxv
Y2F0aW9ucyBmb3IgYW4gSW5saW5lSXRlcmF0b3IuCisgICAgY2xhc3MgSW5saW5lSXRlcmF0b3JI
aXN0b3J5IDogcHJpdmF0ZSBWZWN0b3I8SW5saW5lSXRlcmF0b3IsIDE+IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeSgpID0gZGVsZXRlOworICAgICAgICBJbmxp
bmVJdGVyYXRvckhpc3RvcnkoY29uc3QgSW5saW5lSXRlcmF0b3ImIGluaXRpYWwsIHNpemVfdCBj
YXBhY2l0eSkKKyAgICAgICAgICAgIDogbV9jYXBhY2l0eShjYXBhY2l0eSkKKyAgICAgICAgewor
ICAgICAgICAgICAgQVNTRVJUKGNhcGFjaXR5ID4gMCk7CisgICAgICAgICAgICB0aGlzLT5hcHBl
bmQoaW5pdGlhbCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHB1c2goc3RkOjpmdW5jdGlv
bjx2b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGlmIChtX2Nh
cGFjaXR5ICE9IDEpCisgICAgICAgICAgICAgICAgdGhpcy0+aW5zZXJ0KDAsIElubGluZUl0ZXJh
dG9yKHRoaXMtPmF0KDApKSk7CisgICAgICAgICAgICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKKyAg
ICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9IDEpCisgICAgICAgICAgICAgICAgdGhpcy0+cmVz
aXplKG1fY2FwYWNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGUoc3RkOjpm
dW5jdGlvbjx2b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHVw
ZGF0ZXIodGhpcy0+YXQoMCkpOworICAgICAgICB9CisKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLnJlbmRlcmVyKCk7IH0KKyAgICAg
ICAgdW5zaWduZWQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkub2Zmc2V0KCk7
IH0KKyAgICAgICAgYm9vbCBhdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVy
biB0aGlzLT5hdCgwKS5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKTsgfQorICAgICAgICBVQ2hh
ciBwcmV2aW91c0luU2FtZU5vZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5wcmV2aW91
c0luU2FtZU5vZGUoKTsgfQorICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgZ2V0KHNpemVf
dCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdChpKTsgfTsKKyAgICAgICAgY29uc3QgSW5saW5l
SXRlcmF0b3ImIGN1cnJlbnQoKSBjb25zdCB7IHJldHVybiBnZXQoMCk7IH0KKyAgICAgICAgc2l6
ZV90IGhpc3RvcnlMZW5ndGgoKSBjb25zdCB7IHJldHVybiB0aGlzLT5zaXplKCk7IH0KKworICAg
ICAgICB2b2lkIG1vdmVUbyhSZW5kZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0LCBp
bnQgbmV4dEJyZWFrID0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2goWyZdKElubGlu
ZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhv
YmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisK
KyAgICAgICAgdm9pZCBpbmNyZW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUo
W10oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgbW9kaWZ5TWUu
aW5jcmVtZW50KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQg
Y2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdXNoKFtdKElubGluZUl0ZXJhdG9yJiBt
b2RpZnlNZSkgeworICAgICAgICAgICAgICAgIG1vZGlmeU1lLmNsZWFyKCk7CisgICAgICAgICAg
ICB9KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1f
Y2FwYWNpdHk7CisgICAgfTsKKwogICAgIExpbmVCcmVha2VyJiBtX2xpbmVCcmVha2VyOwogICAg
IElubGluZUJpZGlSZXNvbHZlciYgbV9yZXNvbHZlcjsKIAogICAgIElubGluZUl0ZXJhdG9yIG1f
Y3VycmVudDsKLSAgICBJbmxpbmVJdGVyYXRvciBtX2xpbmVCcmVhazsKKyAgICBJbmxpbmVJdGVy
YXRvckhpc3RvcnkgbV9saW5lQnJlYWtIaXN0b3J5OwogICAgIElubGluZUl0ZXJhdG9yIG1fc3Rh
cnRPZklnbm9yZWRTcGFjZXM7CiAKICAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CkBAIC0y
MjgsOCArMjk0LDEwIEBAIGlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNs
ZWFyJiBjbGVhcikKIHsKICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkpIHsKICAgICAgICAg
UmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5yZW5kZXJlcigpOwotICAgICAgICBtX2xpbmVC
cmVhay5tb3ZlVG9TdGFydE9mKGJyKTsKLSAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7
CisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9k
aWZ5TWUpIHsKKyAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUb1N0YXJ0T2YoYnIpOworICAgICAg
ICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7CisgICAgICAgIH0pOwogCiAgICAgICAgIC8vIEEg
PGJyPiBhbHdheXMgYnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxh
cHNlZAogICAgICAgICAvLyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxp
bmUgd2l0aCBhIDxicj4gZG9lcyBub3QKQEAgLTM1MCw5ICs0MTgsOSBAQCBpbmxpbmUgdm9pZCBC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkKICAgICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8g
bmV4dCBsaW5lIChpbiBjbGVhckZsb2F0cygpIGZ1bmMpCiAgICAgaWYgKG1fZmxvYXRzRml0T25M
aW5lICYmIG1fd2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Js
b2NrLmxvZ2ljYWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKICAgICAgICAgbV9s
aW5lQnJlYWtlci5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOwotICAgICAgICBpZiAo
bV9saW5lQnJlYWsucmVuZGVyZXIoKSA9PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgewotICAgICAg
ICAgICAgQVNTRVJUKCFtX2xpbmVCcmVhay5vZmZzZXQoKSk7Ci0gICAgICAgICAgICBtX2xpbmVC
cmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJl
cigpID09IG1fY3VycmVudC5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fbGlu
ZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSk7CisgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3Rvcnku
aW5jcmVtZW50KCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgbV9mbG9hdHNGaXRP
bkxpbmUgPSBmYWxzZTsKQEAgLTYxMCw5ICs2NzgsOSBAQCBpbmxpbmUgYm9vbCBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9v
bAogICAgICAgICBhdXRvJiBjb21iaW5lUmVuZGVyZXIgPSBkb3duY2FzdDxSZW5kZXJDb21iaW5l
VGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKICAgICAgICAgY29tYmluZVJlbmRlcmVyLmNv
bWJpbmVUZXh0KCk7CiAgICAgICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVyJ3MgdGV4
dCBtYXkgaGF2ZSBjaGFuZ2VkLiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRpb25zCi0g
ICAgICAgIGlmIChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVC
cmVhaywgY29tYmluZVJlbmRlcmVyKSkgeworICAgICAgICBpZiAoaXRlcmF0b3JJc0JleW9uZEVu
ZE9mUmVuZGVyQ29tYmluZVRleHQobV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSwgY29tYmlu
ZVJlbmRlcmVyKSkgewogICAgICAgICAgICAgQVNTRVJUKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJl
bmRlckNvbWJpbmVUZXh0KG1fcmVzb2x2ZXIucG9zaXRpb24oKSwgY29tYmluZVJlbmRlcmVyKSk7
Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIG1fbGlu
ZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKICAgICAgICAgICAgIG1fcmVzb2x2ZXIuaW5jcmVt
ZW50KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC03NjAsMzAgKzgyOCwzNCBAQCBpbmxpbmUgYm9v
bCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1
cmVtZW50cywgYm9vbAogICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRlc3Bh
Y2UuCiAgICAgICAgICAgICAgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lSW5jbHVkaW5n
RXh0cmFXaWR0aChjaGFyV2lkdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2Fz
VG9vV2lkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3Zl
VG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5l
eHRCcmVha2FibGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJy
ZWFrZXIuc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShtX2xpbmVCcmVhaywgbV9saW5lSW5mbyk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5saW5l
SXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5
TWUubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3Vy
cmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1vZGlmeU1lLCBtX2xpbmVJ
bmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9vV2lkZSB8
fCAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkh5
cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRyeUh5cGhlbmF0aW5nKCZyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29u
c2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGlu
ZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxp
bWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3VycmVu
dFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCks
IGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5n
LCBtX2xpbmVCcmVhaywgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVC
cmVha2VyLm1faHlwaGVuYXRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVh
a0hpc3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcoJnJlbmRlclRleHQsIGZvbnQsIHN0eWxl
LmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhl
bmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxl
Lmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwg
bV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZh
aWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNw
YWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9u
KCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5h
dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICht
X2xpbmVCcmVhay5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBt
X2N1cnJlbnQub2Zmc2V0KCkgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3Vy
ZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRy
dWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9
IG1fbGluZUJyZWFrLm9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1
cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKTsKICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsub2Zmc2V0
KCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9saW5lQnJlYWsucmVuZGVyZXIoKSkgJiYgZG93
bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrLnJlbmRlcmVyKCkpLnRleHRMZW5ndGgoKSAm
JiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9saW5lQnJlYWsucmVuZGVyZXIoKSkuY2hhcmFjdGVy
QXQobV9saW5lQnJlYWsub2Zmc2V0KCkgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhl
bnMoKSAhPSBIeXBoZW5zTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFr
SGlzdG9yeS5vZmZzZXQoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PihtX2xpbmVCcmVha0hpc3Rv
cnkucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9y
eS5yZW5kZXJlcigpKS50ZXh0TGVuZ3RoKCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGlu
ZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS5jaGFyYWN0ZXJBdChtX2xpbmVCcmVha0hpc3Rvcnku
b2Zmc2V0KCkgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5z
Tm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsub2Zmc2V0KCkgJiYgbV9saW5lQnJlYWsub2Zm
c2V0KCkgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgJiYgIXdvcmRNZWFz
dXJlbWVudC53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0
b3J5Lm9mZnNldCgpICYmIG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAhPSAodW5zaWduZWQp
d29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7CiAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm9mZnNl
dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZz
ZXQgPSBtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gY2hhcldpZHRoOwogICAgICAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC04MDcsNyArODc5LDcgQEAgaW5s
aW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMsIGJvb2wKICAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmlu
Z1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkpCiAgICAgICAgICAgICAgICAgICAgIGVuc3Vy
ZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CiAg
ICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5y
ZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9z
aXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAg
ICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwogICAgICAgICAgICAg
ICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwogICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQpAQCAtODIzLDcgKzg5NSw3IEBA
IGlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRz
JiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAgICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYm
ICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7
CiAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlv
biBpbiBjYXNlCiAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2Vz
IGEgYnJlYWsuCi0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5y
ZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9z
aXRpb24oKSk7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbyhtX2N1
cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFr
YWJsZVBvc2l0aW9uKCkpOwogICAgICAgICAgICAgICAgIG1pZFdvcmRCcmVhayAmPSAoYnJlYWtX
b3JkcyB8fCBicmVha0FsbCk7CiAgICAgICAgICAgICB9CiAKQEAgLTg3OSw3ICs5NTEsNyBAQCBp
bmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cywgYm9vbAogCiAgICAgICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVy
SXNXUyAmJiBwcmV2aW91c0NoYXJhY3RlcklzV1MpIHsKICAgICAgICAgICAgIGlmIChtX2F1dG9X
cmFwICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSkKLSAgICAg
ICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3Vy
cmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAg
ICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigp
LCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7
CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcykKQEAgLTkxNywxMCArOTg5
LDEzIEBAIGlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3Vy
ZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sCiAgICAgbV9pbmNsdWRlRW5kV2lkdGggPSBm
YWxzZTsKIAogICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgaWYgKGNh
bkh5cGhlbmF0ZSkKLSAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKCZyZW5kZXJUZXh0LCBmb250
LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHls
ZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgp
LCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zm
c2V0KCksIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dp
ZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2Us
IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9jdXJyZW50Lm5leHRCcmVha2Fi
bGVQb3NpdGlvbigpLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCk7CisgICAgICAgIGlmIChj
YW5IeXBoZW5hdGUpIHsKKyAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJ
bmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGlu
ZygmcmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhl
bmF0aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RT
cGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRp
b25hbFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1f
Y29sbGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbW9kaWZ5TWUsIG1fY3Vy
cmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQp
OworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoIWh5cGhlbmF0ZWQg
JiYgbV9saW5lQnJlYWsucHJldmlvdXNJblNhbWVOb2RlKCkgPT0gc29mdEh5cGhlbiAmJiBzdHls
ZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsKKyAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYm
IG1fbGluZUJyZWFrSGlzdG9yeS5wcmV2aW91c0luU2FtZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYm
IHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgewogICAgICAgICAgICAgaHlwaGVuYXRl
ZCA9IHRydWU7CiAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTAw
OCwxMyArMTA4MywxMiBAQCBpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVw
ZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCkKIAogICAgIGlmICghbV9jdXJyZW50LnJlbmRlcmVyKCkt
PmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgewogICAgICAgICBtX2xhc3RPYmpl
Y3QgPSBtX2N1cnJlbnQucmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNS
ZXBsYWNlZCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fbGFzdE9iamVjdC0+aXNSdWJ5UnVuKCkgJiYg
KCFtX2xhc3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFp
czxSZW5kZXJMaXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KSB8fCBkb3duY2FzdDxSZW5kZXJMaXN0
TWFya2VyPigqbV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkgeworICAgICAgICBpZiAobV9sYXN0
T2JqZWN0LT5pc1JlcGxhY2VkKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV9sYXN0T2JqZWN0LT5pc1J1
YnlSdW4oKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0Jy
ZWFrKSAmJiAoIWlzPFJlbmRlckxpc3RNYXJrZXI+KCptX2xhc3RPYmplY3QpIHx8IGRvd25jYXN0
PFJlbmRlckxpc3RNYXJrZXI+KCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKQogICAgICAgICAg
ICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fbmV4dE9iamVjdCk7Ci0gICAgICAg
IH0KICAgICB9CiB9CiAKLWlubGluZSBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFj
ZU9yTm90IGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0
ZSwgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKK2lubGluZSBUcmFpbGluZ09iamVjdHM6OkNvbGxh
cHNlRmlyc3RTcGFjZU9yTm90IGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5l
TWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKIHsKICAgICAvLyBD
aGVjayB0byBzZWUgaWYgb3VyIGxhc3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQg
dGhlIGxpbmUgYnJlYWsuIElmIHNvLAogICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUgbGlzdCwgYW5k
IHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQgcG9pbnQgZG9l
c24ndApAQCAtMTA0MCwxMiArMTExNCwxMiBAQCBpbmxpbmUgVHJhaWxpbmdPYmplY3RzOjpDb2xs
YXBzZUZpcnN0U3BhY2VPck5vdCBjaGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZQogCiBp
bmxpbmUgSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUoKQog
ewotICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKLSAgICAg
ICAgaWYgKCFtX2xpbmVCcmVhay5yZW5kZXJlcigpIHx8ICFtX2xpbmVCcmVhay5yZW5kZXJlcigp
LT5pc0JSKCkpIHsKKyAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSA9PSBtX3Jl
c29sdmVyLnBvc2l0aW9uKCkpIHsKKyAgICAgICAgaWYgKCFtX2xpbmVCcmVha0hpc3RvcnkucmVu
ZGVyZXIoKSB8fCAhbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCktPmlzQlIoKSkgewogICAg
ICAgICAgICAgLy8gd2UganVzdCBhZGQgYXMgbXVjaCBhcyBwb3NzaWJsZQogICAgICAgICAgICAg
aWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJFICYmICFtX2N1cnJlbnQub2Zmc2V0
KCkpCiAgICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fbGFz
dE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVjdC0+bGVuZ3RoKCkg
OiAwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1fbGluZUJyZWFrLnJlbmRlcmVyKCkpIHsKKyAg
ICAgICAgICAgIGVsc2UgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKSB7CiAgICAg
ICAgICAgICAgICAgLy8gRG9uJ3QgZXZlciBicmVhayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBp
ZiB3ZSBjYW4gaGVscCBpdC4KICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJvb20gYXQg
YWxsLiBXZSBqdXN0IGhhdmUgdG8gYmUgb24gdGhpcyBsaW5lLAogICAgICAgICAgICAgICAgIC8v
IGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4KQEAgLTEwNTMsMzMgKzExMjcsNzQgQEAgaW5s
aW5lIElubGluZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKICAg
ICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBh
dCBsZWFzdCBvbmUgY2hhci9vYmplY3QuCi0gICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jl
c29sdmVyLnBvc2l0aW9uKCkpCi0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsK
KyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCkgPT0gbV9yZXNvbHZlci5w
b3NpdGlvbigpKQorICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwog
ICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5vZmZzZXQoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRX
aWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYmICFtX2hhZFVuY29tbWl0dGVk
V2lkdGhCZWZvcmVDdXJyZW50KSB7CiAgICAgICAgIC8vIERvIG5vdCBwdXNoIHRoZSBjdXJyZW50
IG9iamVjdCB0byB0aGUgbmV4dCBsaW5lLCB3aGVuIHRoaXMgbGluZSBoYXMgc29tZSBjb250ZW50
LCBidXQgaXQgaXMgc3RpbGwgY29uc2lkZXJlZCBlbXB0eS4KICAgICAgICAgLy8gRW1wdHkgaW5s
aW5lIGVsZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFu
ZCBub3cgd2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcwogICAgICAgICAv
LyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBpZiBubyB3aWR0aCBoYXMgYmVlbiBjb21taXR0ZWQg
eWV0LgogICAgICAgICAvLyBCZWhhdmUgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IGVtcHR5IGFuZCBj
b25zdW1lIGF0IGxlYXN0IG9uZSBvYmplY3QuCi0gICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVu
dCgpOworICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7CiAgICAgfQogCiAg
ICAgLy8gU2FuaXR5IGNoZWNrIG91ciBtaWRwb2ludHMuCi0gICAgVHJhaWxpbmdPYmplY3RzOjpD
b2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjb2xsYXBzZWQgPSBjaGVja01pZHBvaW50cyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhayk7CisgICAgVHJhaWxpbmdPYmplY3RzOjpDb2xsYXBz
ZUZpcnN0U3BhY2VPck5vdCBjb2xsYXBzZWQgPSBjaGVja01pZHBvaW50cyhtX2xpbmVNaWRwb2lu
dFN0YXRlLCBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpKTsKIAotICAgIG1fdHJhaWxpbmdP
YmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0
ZSwgbV9saW5lQnJlYWssIGNvbGxhcHNlZCk7CisgICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRl
TWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVh
a0hpc3RvcnkuY3VycmVudCgpLCBjb2xsYXBzZWQpOwogCiAgICAgLy8gV2UgbWlnaHQgaGF2ZSBt
YWRlIGxpbmVCcmVhayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKICAgICAv
LyBvZiB0aGUgb2JqZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0
aGUgc3RhcnQKICAgICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25m
dXNpbmcgdGhlIHJlc3Qgb2YgdGhlCiAgICAgLy8gY29kZS4KLSAgICBpZiAobV9saW5lQnJlYWsu
b2Zmc2V0KCkpIHsKLSAgICAgICAgbV9saW5lQnJlYWsuc2V0T2Zmc2V0KG1fbGluZUJyZWFrLm9m
ZnNldCgpIC0gMSk7Ci0gICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgIGlmICht
X2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkpIHsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5
LnVwZGF0ZShbXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgIG1vZGlm
eU1lLnNldE9mZnNldChtb2RpZnlNZS5vZmZzZXQoKSAtIDEpOworICAgICAgICAgICAgbW9kaWZ5
TWUuaW5jcmVtZW50KCk7CisgICAgICAgIH0pOwogICAgIH0KIAotICAgIHJldHVybiBtX2xpbmVC
cmVhazsKKyNpZiBFTkFCTEUoQ1NTX1RSQUlMSU5HX1dPUkQpCisgICAgaWYgKG1fYmxvY2tTdHls
ZS50cmFpbGluZ1dvcmQoKSA9PSBUcmFpbGluZ1dvcmQ6OlBhcnRpYWxseUJhbGFuY2VkKQorICAg
ICAgICByZXR1cm4gb3B0aW1hbExpbmVCcmVha0xvY2F0aW9uRm9yVHJhaWxpbmdXb3JkKCk7Cisj
ZW5kaWYKKyAgICByZXR1cm4gbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKTsKIH0KIAorI2lm
IEVOQUJMRShDU1NfVFJBSUxJTkdfV09SRCkKK2lubGluZSBJbmxpbmVJdGVyYXRvciBCcmVha2lu
Z0NvbnRleHQ6Om9wdGltYWxMaW5lQnJlYWtMb2NhdGlvbkZvclRyYWlsaW5nV29yZCgpCit7Cisg
ICAgSW5saW5lSXRlcmF0b3IgbGluZUJyZWFrID0gbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQo
KTsKKyAgICBpZiAoIWxpbmVCcmVhay5yZW5kZXJlcigpIHx8ICFtX2xpbmVJbmZvLmlzRmlyc3RM
aW5lKCkgfHwgYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcygqbGluZUJyZWFrLnJvb3QoKSwg
bGluZUJyZWFrLnJlbmRlcmVyKCkpIHx8ICFpczxSZW5kZXJUZXh0PihsaW5lQnJlYWsucmVuZGVy
ZXIoKSkpCisgICAgICAgIHJldHVybiBsaW5lQnJlYWs7CisgICAgUmVuZGVyVGV4dCYgcmVuZGVy
VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KCpsaW5lQnJlYWsucmVuZGVyZXIoKSk7CisgICAg
Ly8gRG9uJ3QgZXZlbiBib3RoZXIgbWVhc3VyaW5nIGlmIG91ciByZW1haW5pbmcgbGluZSBoYXMg
bWFueSBjaGFyYWN0ZXJzCisgICAgaWYgKHJlbmRlclRleHQudGV4dExlbmd0aCgpID09IGxpbmVC
cmVhay5vZmZzZXQoKSB8fCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAtIGxpbmVCcmVhay5vZmZz
ZXQoKSA+IDIwKQorICAgICAgICByZXR1cm4gbGluZUJyZWFrOworICAgIGJvb2wgaXNMb29zZUNK
S01vZGUgPSBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSAmcmVuZGVyVGV4dCAmJiBtX3JlbmRl
clRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IuaXNMb29zZUNKS01vZGUoKTsKKyAgICBib29s
IGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPm5ic3BNb2RlKCkgPT0g
U1BBQ0U7CisgICAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbiA9IGxpbmVCcmVhay5uZXh0QnJl
YWthYmxlUG9zaXRpb24oKTsKKyAgICBpc0JyZWFrYWJsZShtX3JlbmRlclRleHRJbmZvLm1fbGlu
ZUJyZWFrSXRlcmF0b3IsIGxpbmVCcmVhay5vZmZzZXQoKSArIDEsIG5leHRCcmVha2FibGVQb3Np
dGlvbiwgYnJlYWtOQlNQLCBpc0xvb3NlQ0pLTW9kZSk7CisgICAgaWYgKG5leHRCcmVha2FibGVQ
b3NpdGlvbiA8IDAgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG5leHRCcmVha2FibGVQb3NpdGlv
bikgIT0gcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBsaW5lQnJlYWs7
CisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0eWxlKHJlbmRlclRleHQsIG1f
bGluZUluZm8pOworICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUuZm9udENhc2Nh
ZGUoKTsKKyAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBkdW1teUZvbnRzOworICAgIElubGluZUl0
ZXJhdG9yIGJlc3QgPSBsaW5lQnJlYWs7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtX2xp
bmVCcmVha0hpc3RvcnkuaGlzdG9yeUxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5s
aW5lSXRlcmF0b3ImIGNhbmRpZGF0ZSA9IG1fbGluZUJyZWFrSGlzdG9yeS5nZXQoaSk7CisgICAg
ICAgIGlmIChjYW5kaWRhdGUucmVuZGVyZXIoKSAhPSBsaW5lQnJlYWsucmVuZGVyZXIoKSkKKyAg
ICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICBmbG9hdCB3aWR0aCA9IHRleHRXaWR0aCgm
cmVuZGVyVGV4dCwgY2FuZGlkYXRlLm9mZnNldCgpLCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAt
IGNhbmRpZGF0ZS5vZmZzZXQoKSwgZm9udCwgMCwgZm9udC5pc0ZpeGVkUGl0Y2goKSwgbV9jb2xs
YXBzZVdoaXRlU3BhY2UsIGR1bW15Rm9udHMpOworICAgICAgICBpZiAod2lkdGggPiBtX3dpZHRo
LmF2YWlsYWJsZVdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gYmVzdDsKKyAgICAgICAgaWYg
KHdpZHRoIC8gbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpID4gMC4xKSAvLyBTdWJzZXF1ZW50IGxp
bmUgaXMgbG9uZyBlbm91Z2gKKyAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7CisgICAgICAg
IGJlc3QgPSBjYW5kaWRhdGU7CisgICAgfQorICAgIHJldHVybiBiZXN0OworfQorI2VuZGlmCisK
IH0KIAogI2VuZGlmIC8vIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaApkaWZmIC0tZ2l0
IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4IGQ4
MDU0ZDRkYTBjZWNhYmJmM2YxOTk5MGY2MDMxM2VmOTEyYzYzYWUuLjlhY2FkNGE0ODZjYWZiYTdm
NTliOGE5MGE1NWZjMjhjNmNhNTk3YTggMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5nZUxv
ZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxNS0wMy0w
NCAgTXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRAYXBwbGUuY29tPgorCisgICAgICAgIElt
cGxlbWVudCAtYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjUzCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBmYXN0L3Rl
eHQvdHJhaWxpbmctd29yZC1leHBlY3RlZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3Rl
eHQvdHJhaWxpbmctd29yZC5odG1sOiBBZGRlZC4KKwogMjAxNS0wMy0wMyAgIFlvYXYgV2Vpc3Mg
IDx5b2F2QHlvYXYud3M+CiAKICAgICAgICAgQWRkIGEgbWljcm90YXNrIGFic3RyYWN0aW9uCmRp
ZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC1leHBlY3RlZC5o
dG1sIGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0ZWQuaHRtbApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5mNjAyNGFkYjU3M2JmNzliMDJhZjQ2MWViZjc2OGU0YThjNDFhYTNlCi0tLSAv
ZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC90ZXh0L3RyYWlsaW5nLXdvcmQtZXhwZWN0
ZWQuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+
Cis8L2hlYWQ+Cis8Ym9keT4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgLWFwcGxlLXRyYWls
aW5nLXdvcmQ6IC1hcHBsZS1wYXJ0aWFsbHktYmFsYW5jZWQgYnJlYWtzIGxpbmVzIGNvcnJlY3Rs
eS4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBBaGVtOyI+Cis8ZGl2PkFCQyBERUYgR0hJIEpL
TCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0w8YnI+TU5PPC9kaXY+Cis8ZGl2PkFC
QyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISTxicj5KS0wgTU5PPC9k
aXY+Cis8ZGl2PkFCQyBERUYgR0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEcgSDxi
cj5JIEogSzwvZGl2PgorPGRpdj5BQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWVyBYWVogQUJD
IERFRiBHSEkgSktMPGJyPk1OTyBQUVJTPC9kaXY+Cis8ZGl2PkFCQyBERUYgR0hJIEpLTCBNTk8g
UFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0w8YnI+TU5PIFBRUlMgVFVWIFdYWVogQUJDIERF
RiBHSEkgSktMIE1OTyBQUVJTIFRVVjxicj5XWFlaPC9kaXY+Cis8L2Rpdj4KKzwvYm9keT4KKzwv
aHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvdGV4dC90cmFpbGluZy13b3JkLmh0
bWwgYi9MYXlvdXRUZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC5odG1sCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmUwODI0ZTU0ZTVkYWJmMGY5MmY4OGU2YmZiM2EzZDUwYzkwOWQ4MzgKLS0tIC9kZXYvbnVsbAor
KysgYi9MYXlvdXRUZXN0cy9mYXN0L3RleHQvdHJhaWxpbmctd29yZC5odG1sCkBAIC0wLDAgKzEs
MTUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzwvaGVhZD4KKzxib2R5Pgor
VGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCAtYXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBh
cnRpYWxseS1iYWxhbmNlZCBicmVha3MgbGluZXMgY29ycmVjdGx5LgorPGRpdiBzdHlsZT0iZm9u
dC1mYW1pbHk6IEFoZW07Ij4KKzxkaXY+QUJDIERFRiBHSEkgSktMIE1OTyBQUVJTIFRVVlcgWFla
IEFCQyBERUYgR0hJIEpLTCBNTk88L2Rpdj4KKzxkaXYgc3R5bGU9Ii1hcHBsZS10cmFpbGluZy13
b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkOyI+QUJDIERFRiBHSEkgSktMIE1OTyBQUVJT
IFRVVlcgWFlaIEFCQyBERUYgR0hJIEpLTCBNTk88L2Rpdj4KKzxkaXYgc3R5bGU9Ii1hcHBsZS10
cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFuY2VkOyI+QUJDIERFRiBHSEkgSktM
IE1OTyBQUVJTIFRVVlcgWFlaIEFCQyBERUYgRyBIIEkgSiBLPC9kaXY+Cis8ZGl2IHN0eWxlPSIt
YXBwbGUtdHJhaWxpbmctd29yZDogLWFwcGxlLXBhcnRpYWxseS1iYWxhbmNlZDsiPkFCQyBERUYg
R0hJIEpLTCBNTk8gUFFSUyBUVVZXIFhZWiBBQkMgREVGIEdISSBKS0wgTU5PIFBRUlM8L2Rpdj4K
KzxkaXYgc3R5bGU9Ii1hcHBsZS10cmFpbGluZy13b3JkOiAtYXBwbGUtcGFydGlhbGx5LWJhbGFu
Y2VkOyI+QUJDIERFRiBHSEkgSktMIE1OTyBQUVJTIFRVVlcgWFlaIEFCQyBERUYgR0hJIEpLTCBN
Tk8gUFFSUyBUVVYgV1hZWiBBQkMgREVGIEdISSBKS0wgTU5PIFBRUlMgVFVWIFdYWVo8L2Rpdj4K
KzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgo=
</data>
<flag name="review"
          id="272799"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>