<?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>156913</bug_id>
          
          <creation_ts>2016-04-22 09:14:40 -0700</creation_ts>
          <short_desc>RenderMathMLOperator: refactor management of stretchy data and italic correction</short_desc>
          <delta_ts>2016-05-08 23:07:42 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>MathML</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>156906</dependson>
    
    <dependson>156910</dependson>
          <blocked>152244</blocked>
    
    <blocked>156921</blocked>
    
    <blocked>156950</blocked>
    
    <blocked>157071</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Frédéric Wang Nélar">fred.wang</reporter>
          <assigned_to name="Frédéric Wang Nélar">fred.wang</assigned_to>
          <cc>alex</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dbarton</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>mrobinson</cc>
    
    <cc>rego</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1186267</commentid>
    <comment_count>0</comment_count>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-22 09:14:40 -0700</bug_when>
    <thetext>One more step towards bug 152244.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186275</commentid>
    <comment_count>1</comment_count>
      <attachid>277066</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-22 09:34:05 -0700</bug_when>
    <thetext>Created attachment 277066
Patch (for EWS testing)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186276</commentid>
    <comment_count>2</comment_count>
      <attachid>277067</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-22 09:36:45 -0700</bug_when>
    <thetext>Created attachment 277067
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186383</commentid>
    <comment_count>3</comment_count>
      <attachid>277067</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-22 13:06:58 -0700</bug_when>
    <thetext>Comment on attachment 277067
Patch

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

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:552
&gt;                  if (size &gt;= stretchSize()) 

this should be targetSize</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186877</commentid>
    <comment_count>4</comment_count>
      <attachid>277230</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-25 00:49:04 -0700</bug_when>
    <thetext>Created attachment 277230
Patch

Update patch after http://trac.webkit.org/changeset/199978</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1187725</commentid>
    <comment_count>5</comment_count>
      <attachid>277471</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-04-27 05:56:13 -0700</bug_when>
    <thetext>Created attachment 277471
Patch

Minor change: the removal of the character parameter of findStretchyData is done in bug 156910.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1190670</commentid>
    <comment_count>6</comment_count>
      <attachid>277471</attachid>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2016-05-06 05:42:14 -0700</bug_when>
    <thetext>Comment on attachment 277471
Patch

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

The refactor looks good, just some minor points.

&gt; Source/WebCore/ChangeLog:10
&gt; +        We use union to simplify the structure used to manage the glyph assembly and the type of stretching.

I would say the union does not simplify, it saves memory and explains we can not use both members at the same time. Is it like this? I do not see them in WebKit that frequently but in this case it makes sense to add meaning about just one of the options is valid.

&gt; Source/WebCore/ChangeLog:11
&gt; +        We also modify the signature of some functions to retrieve display operator and stretchy data.

Can you add the reason to modify the signature of these functions?

&gt; Source/WebCore/ChangeLog:21
&gt; +        (WebCore::RenderMathMLOperator::findDisplayStyleLargeOperator): We rename the function and
&gt; +        change its signature to remove the return value.
&gt; +        We now also set the italic correction when a display operator is found.

Join the lines that are about the same function.

&gt; Source/WebCore/ChangeLog:37
&gt; +        (WebCore::RenderMathMLOperator::italicCorrection): Deleted.

The function is not deleted but moved to the header.

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:308
&gt; +        findDisplayStyleLargeOperator();

If I understood correctly this function I&apos;d rather use a name such as: calculateLargeOperatorDisplayStyle.

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:385
&gt; +    ASSERT(sizeVariant.isValid() &amp;&amp; sizeVariant.font-&gt;mathData());

Is the mathData assertion checked every time we call this function?

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:396
&gt; +bool RenderMathMLOperator::getGlyphAssemblyFallBack(Vector&lt;OpenTypeMathData::AssemblyPart&gt; assemblyParts, GlyphAssemblyData&amp; assemblyData) const

I would use again calculate in the name of the function.

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:498
&gt; +void RenderMathMLOperator::findDisplayStyleLargeOperator()

See previous comment about the name of the function.

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:504
&gt;      if (!getBaseGlyph(style(), baseGlyph) || !baseGlyph.font-&gt;mathData())
&gt; -        return data;
&gt; +        return;

Are we sure the values are the same we got when returning data?

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:524
&gt; +void RenderMathMLOperator::findStretchyData(float* maximumGlyphWidth, LayoutUnit targetSize)

I would use calculate again here.

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.h:89
&gt; +    struct GlyphAssemblyData {
&gt; +        union {
&gt; +            GlyphData top;
&gt; +            GlyphData right;
&gt; +        };
&gt; +        GlyphData extension;
&gt; +        union {
&gt; +            GlyphData bottom;
&gt; +            GlyphData left;
&gt; +        };
&gt; +        GlyphData middle;
&gt; +    GlyphAssemblyData()
&gt; +    : top(), extension(), bottom(), middle() { }
&gt;      };

We usually put the constructor as the first member in the structs, also use one line per field initialized. Check other definitions for reference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1190672</commentid>
    <comment_count>7</comment_count>
      <attachid>277471</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-05-06 06:24:45 -0700</bug_when>
    <thetext>Comment on attachment 277471
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:10
&gt;&gt; +        We use union to simplify the structure used to manage the glyph assembly and the type of stretching.
&gt; 
&gt; I would say the union does not simplify, it saves memory and explains we can not use both members at the same time. Is it like this? I do not see them in WebKit that frequently but in this case it makes sense to add meaning about just one of the options is valid.

The old code already uses a shared m_data array and some member functions of different names. So the memory management &amp; presentation of members do not really change: it&apos;s just becomes a simple struct instead of a more complex class. And yes, there are already ASSERT checking that the we correctly call the members depending of direction / kind of structure.

&gt;&gt; Source/WebCore/ChangeLog:11
&gt;&gt; +        We also modify the signature of some functions to retrieve display operator and stretchy data.
&gt; 
&gt; Can you add the reason to modify the signature of these functions?

Yes I&apos;ll do that. It&apos;s just because in the MathOperator class we will directly set the members instead of returning them.

&gt;&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:385
&gt;&gt; +    ASSERT(sizeVariant.isValid() &amp;&amp; sizeVariant.font-&gt;mathData());
&gt; 
&gt; Is the mathData assertion checked every time we call this function?

Currently this function is called in two places where sizeVariant.font is set to the font that was used to retrieve sizeVariant.glyph value... from the MATH table. So font-&gt;mathData() is checked before the use.

&gt;&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:396
&gt;&gt; +bool RenderMathMLOperator::getGlyphAssemblyFallBack(Vector&lt;OpenTypeMathData::AssemblyPart&gt; assemblyParts, GlyphAssemblyData&amp; assemblyData) const
&gt; 
&gt; I would use again calculate in the name of the function.

I&apos;m not sure I understand the subtility... At the end the goal is to set the variant/assembly in the MathOperator class so I see that set/calculate is better for findDisplayOperator &amp; findStretchyData. However, here the use is different: We only convert the MATH table&apos;s GlyphAssembly structure into our fallback GlyphAssemblyData structure (the assembly is only set in findStretchyData).

&gt;&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp:504
&gt;&gt; +        return;
&gt; 
&gt; Are we sure the values are the same we got when returning data?

This would return an unstretched data which is how it is initialized in RenderMathMLOperator::updateStyle.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1190675</commentid>
    <comment_count>8</comment_count>
      <attachid>278250</attachid>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-05-06 06:55:57 -0700</bug_when>
    <thetext>Created attachment 278250
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1190986</commentid>
    <comment_count>9</comment_count>
      <attachid>278250</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-05-07 15:19:04 -0700</bug_when>
    <thetext>Comment on attachment 278250
Patch

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

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.h:78
&gt; +        GlyphAssemblyData()
&gt; +        : top(), extension(), bottom(), middle() { }

This formatting is not so good. Either put it all one one line, or indent the second line please.

I don’t think the explicit extension and middle initialization is needed.

What happens if you omit this constructor? Do we get a compile time error? Is there some way to get the compiler to generate this without us.

I suggest considering omitting these unions since the types are the same. Just:

    GlyphData topOrRight;

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.h:94
&gt; +    enum StretchType {
&gt; +        Unstretched,
&gt; +        SizeVariant,
&gt; +        GlyphAssembly
&gt; +    };

I think this usually looks better when all on a single line. Also worth considering using an enum class rather than old-style enum.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1190987</commentid>
    <comment_count>10</comment_count>
      <attachid>278250</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-05-07 15:19:50 -0700</bug_when>
    <thetext>Comment on attachment 278250
Patch

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

&gt; Source/WebCore/rendering/mathml/RenderMathMLOperator.h:118
&gt; +    bool calculateGlyphAssemblyFallBack(Vector&lt;OpenTypeMathData::AssemblyPart&gt;, GlyphAssemblyData&amp;) const;

Peculiar to take a Vector as an argument. Usually it would be const Vector&amp; or Vector&amp;&amp;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1191137</commentid>
    <comment_count>11</comment_count>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-05-08 22:51:00 -0700</bug_when>
    <thetext>Committed r200569: &lt;http://trac.webkit.org/changeset/200569&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1191138</commentid>
    <comment_count>12</comment_count>
    <who name="Frédéric Wang Nélar">fred.wang</who>
    <bug_when>2016-05-08 23:07:42 -0700</bug_when>
    <thetext>OK, I&apos;ve removed the union for GlyphData and used the enum class.

The comment about Vector was actually already handled in bug 156921, apparently I forgot it when I split the patch.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>277066</attachid>
            <date>2016-04-22 09:34:05 -0700</date>
            <delta_ts>2016-05-06 06:55:42 -0700</delta_ts>
            <desc>Patch (for EWS testing)</desc>
            <filename>bug-156913-20160422183426.patch</filename>
            <type>text/plain</type>
            <size>50373</size>
            <attacher name="Frédéric Wang Nélar">fred.wang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk5ODY5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNDY3MjUwNGJiODVjMmY1
YTBmZjRmMzQ5YjFhZTRkNGU2ZGQ0MDI1Ny4uMTA0ZTM4ZDA0OTU2MGU2OGFlNjI2OWNmOTE4NTJk
NGQ0YjU4NDhhYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkyIEBACisyMDE2LTA0LTIyICBGcmVk
ZXJpYyBXYW5nICA8ZndhbmdAaWdhbGlhLmNvbT4KKworICAgICAgICBSZW5kZXJNYXRoTUxPcGVy
YXRvcjogcmVmYWN0b3IgbWFuYWdlbWVudCBvZiBzdHJldGNoeSBkYXRhIGFuZCBpdGFsaWMgY29y
cmVjdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTU2OTEzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLCBiZWhhdmlvciBpcyBub3QgY2hhbmdlZC4KKworICAgICAgICBXZSB1c2Ug
dW5pb24gdG8gc2ltcGxpZnkgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIG1hbmFnZSB0aGUgZ2x5cGgg
YXNzZW1ibHkgYW5kIHRoZSB0eXBlIG9mIHN0cmV0Y2hpbmcuCisgICAgICAgIFdlIGFsc28gbW9k
aWZ5IHRoZSBzaWduYXR1cmUgb2Ygc29tZSBmdW5jdGlvbnMgdG8gcmV0cmlldmUgZGlzcGxheSBv
cGVyYXRvciBhbmQgc3RyZXRjaHkgZGF0YS4KKyAgICAgICAgRmluYWxseSwgd2UgaW50cm9kdWNl
IHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBlYXNpbHkgc2V0IHRoZSBzdHJldGNoeSBkYXRhLgor
CisgICAgICAgICogcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZVByZWZlcnJlZExv
Z2ljYWxXaWR0aHMpOiBVc2UgdGhlIG5ldyBkYXRhIG1lbWJlcnMgYW5kIGZ1bmN0aW9uIHNpZ25h
dHVyZXMuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c2V0U2l6ZVZh
cmlhbnQpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIHNpemUgdmFyaWFudC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpzZXRHbHlwaEFzc2VtYmx5KTogTmV3
IGhlbHBlciBmdW5jdGlvbiB0byBzZXQgYSBnbHlwaCBhc3NlbWJseS4KKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2spOiBXZSBj
aGFuZ2UgdGhlIHNpZ25hdHVyZSB0byB1c2UgYSBHbHlwaEFzc2VtYmx5RGF0YS4KKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVy
YXRvcik6IFdlIHJlbmFtZSB0aGUgZnVuY3Rpb24gYW5kCisgICAgICAgIGNoYW5nZSBpdHMgc2ln
bmF0dXJlIHRvIHJlbW92ZSB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgICBXZSBub3cgYWxzbyBz
ZXQgdGhlIGl0YWxpYyBjb3JyZWN0aW9uIHdoZW4gYSBkaXNwbGF5IG9wZXJhdG9yIGlzIGZvdW5k
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRTdHJldGNoeURh
dGEpOiBXZSBjaGFuZ2UgdGhlIHNpZ25hdHVyZSB0byBpbnRyb2R1Y2UgYQorICAgICAgICB0YXJn
ZXQgc2l6ZSBhbmQgcmVtb3ZlIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICAgIFdlIGFsc28gcmVt
b3ZlIHRoZSBjaGFyYWN0ZXIgcGFyYW1ldGVyIHdoaWNoIGlzIGFsd2F5cyBtX3RleHRDb250ZW50
LgorICAgICAgICBUaGlzIGFsc28gZG9lcyB0aGUgZWFybHkgcmV0dXJuIHdoZW4gdGhlIGJhc2Ug
Z2x5cGggaXMgbGFyZ2UgZW5vdWdoLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnVwZGF0ZVN0eWxlKTogV2UgdXNlIHRoZSBuZXcgZGF0YSBtZW1iZXJzIGFuZCBmdW5j
dGlvbiBzaWduYXR1cmVzLgorICAgICAgICBUaGUgY2hlY2sgZm9yIHRoZSBiYXNlIGdseXBoIHNp
emUgaXMgbm93IGRvbmUgaW4gZmluZFN0cmV0Y2h5RGF0YSwgc28gd2UganVzdCBjaGVjayB3aGV0
aGVyCisgICAgICAgIG1fc3RyZXRjaFR5cGUgaXMgVW5zdHJldGNoZWQgdG8gZG8gYW4gZWFybHkg
cmV0dXJuLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpcnN0TGlu
ZUJhc2VsaW5lKTogV2UgdXNlIG1fc3RyZXRjaFR5cGUuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9u
R2x5cGgpOiBVc2UgdGhlIG5ldyBjbGFzcyBtZW1iZXJzLgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnQpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRpY2Fs
R2x5cGhBc3NlbWJseSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50SG9yaXpvbnRhbEdseXBoQXNzZW1ibHkpOiBEaXR0by4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludENoaWxkcmVuKTogRGl0dG8uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dHJhaWxpbmdTcGFjZUVycm9yKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXRhbGljQ29y
cmVjdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6Z2V0RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcik6IERlbGV0ZWQuCisgICAgICAgICogcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyTWF0aE1MT3BlcmF0b3I6Oml0YWxpY0NvcnJlY3Rpb24pOiBXZSBqdXN0IHJldHVybiBt
X2l0YWxpY0NvcnJlY3Rpb24uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6R2x5cGhBc3NlbWJseURhdGE6OkdseXBoQXNzZW1ibHlEYXRhKTogTmV3IGNsYXNzIHRvIHN0
b3JlIGFuIGFzc2VtYmx5IG9mIEdseXBoRGF0YS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1h
dGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6Om1vZGUpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6dmFyaWFudCk6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRh
Ojp0b3ApOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6
OlN0cmV0Y2h5RGF0YTo6ZXh0ZW5zaW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OmJvdHRvbSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjptaWRkbGUp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0
Y2h5RGF0YTo6bGVmdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxP
cGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpyaWdodCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpzZXROb3JtYWxNb2RlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURh
dGE6OnNldFNpemVWYXJpYW50TW9kZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpzZXRHbHlwaEFzc2VtYmx5TW9kZSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlE
YXRhOjpTdHJldGNoeURhdGEpOiBEZWxldGVkLgorCisyMDE2LTA0LTIyICBGcmVkZXJpYyBXYW5n
ICA8ZnJlZC53YW5nQGZyZWUuZnI+CisKKyAgICAgICAgUmVuZGVyTWF0aE1MT3BlcmF0b3IgcmVm
YWN0b3Jpbmc6IGludHJvZHVjZSBnZXRCYXNlR2x5cGggYW5kIHJlbW92ZSBwYXJhbWV0ZXIgZnJv
bSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY5MTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIHRoZSBiZWhhdmlvciBpcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICAqIHJlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0
b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6Oml0YWxpY0Nv
cnJlY3Rpb24pOiBXZSBkbyBub3QgbmVlZCB0byBwYXNzIG1fdGV4dENvbnRlbnQgdG8gZ2V0RGlz
cGxheVN0eWxlTGFyZ2VPcGVyYXRvci4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpjb21wdXRlUHJlZmVycmVkTG9naWNhbFdpZHRocyk6IFdlIHVzZSBnZXRCYXNlR2x5
cGggYW5kIGRvIG5vdCBwYXNzIG1fdGV4dENvbnRlbnQgdG8gZ2V0RGlzcGxheVN0eWxlTGFyZ2VP
cGVyYXRvci4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRCYXNl
R2x5cGgpOiBJbnRyb2R1Y2UgYSBoZWxwZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGJhc2Ug
Z2x5cGggYW5kIGRvIHNvbWUgdmFsaWRpdHkgY2hlY2tzLgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IpOiBXZSByZW1v
dmUgdGhlIGNoYXJhY3RlciBwYXJhbWV0ZXIgYXMgaXQgaXMgYWx3YXlzIG1fdGV4dENvbnRlbnQu
CisgICAgICAgIFdlIHVzZSBnZXRCYXNlR2x5cGggYW5kIHJlcGxhY2UgcHJpbWFyeUZvbnQgd2l0
aCBiYXNlR2x5cGguZm9udC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9y
OjpmaW5kU3RyZXRjaHlEYXRhKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUpOiBXZSBkbyBub3QgcGFzcyBtX3RleHRDb250ZW50IHRv
IGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCisgICAgICAgICogcmVuZGVyaW5nL21hdGht
bC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oOiBEZWNsYXJlIGdldEJhc2VHbHlwaCBhbmQgcmVtb3Zl
IHRoZSBwYXJhbWV0ZXIgZnJvbSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yLgorCisyMDE2
LTA0LTIyICBGcmVkZXJpYyBXYW5nICA8ZndhbmdAaWdhbGlhLmNvbT4KKworICAgICAgICBNaW5v
ciByZWZhY3RvcmluZyBpbiBSZW5kZXJNYXRoTUxPcGVyYXRvcgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTA2CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCB0aGlzIGlzIG9ubHkg
bWlub3IgcmVmYWN0b3JpbmcgdGhhdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGNvZGUuCisKKyAgICAg
ICAgKiByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2sp
OgorICAgICAgICBXZSByZW5hbWUgdGhlICJzdGF0ZSIgaW50ZWdlciB0byBhbiAiZXhwZWN0ZWQi
IGVudW0gaW5kaWNhdGluZyB0aGUgbmV4dCBleHBlY3RlZCBwYXJ0LgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50R2x5cGgpOiBXZSBhZGQgYSBtaXNzaW5nIGRv
dCBhdCB0aGUgZW5kIG9mIGEgc2VxdWVuY2UuCisgICAgICAgIFdlIGFsc28gcmVwbGFjZSBjZWls
KHgrMSkgd2l0aCBjZWlsKHgpKzEgdG8gZ2V0IHJpZCBvZiB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxl
LgorCiAyMDE2LTA0LTIxICBGcmVkZXJpYyBXYW5nICA8ZndhbmdAaWdhbGlhLmNvbT4KIAogICAg
ICAgICBNb3JlIGltcHJvdmVtZW50cyBhbmQgZXhwbGFuYXRpb25zIHJlZ2FyZGluZyByZXNldHRp
bmcgQ1NTIHByb3BlcnRpZXMgb24gdGhlIDxtYXRoPiBlbGVtZW50CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCmlu
ZGV4IDgzZGIzNTIzMjg4NjFjNzQwOGZkMzhmMDUxMDYyNjVlOTY1MzI5YmUuLjc5MDkwMmQ5Zjhj
YzNjNmU0MGE2OTdiZTcxYmIyM2FiM2Y4ZDNlZTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCkBAIC0yMDIs
MTggKzIwMiw2IEBAIGJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmlzQ2hpbGRBbGxvd2VkKGNv
bnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFJlbmRlclN0eWxlCiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi1MYXlvdXRVbml0IFJlbmRlck1hdGhNTE9wZXJhdG9yOjppdGFsaWNDb3JyZWN0aW9uKCkg
Y29uc3QKLXsKLSAgICBpZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSkgewotICAg
ICAgICBjb25zdCBhdXRvJiBwcmltYXJ5Rm9udCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5wcmlt
YXJ5Rm9udCgpOwotICAgICAgICBpZiAoYXV0byogbWF0aERhdGEgPSBwcmltYXJ5Rm9udC5tYXRo
RGF0YSgpKSB7Ci0gICAgICAgICAgICBTdHJldGNoeURhdGEgbGFyZ2VPcGVyYXRvciA9IGdldERp
c3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IobV90ZXh0Q29udGVudCk7Ci0gICAgICAgICAgICByZXR1
cm4gbWF0aERhdGEtPmdldEl0YWxpY0NvcnJlY3Rpb24ocHJpbWFyeUZvbnQsIGxhcmdlT3BlcmF0
b3IudmFyaWFudCgpLmdseXBoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0K
LQogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c3RyZXRjaFRvKExheW91dFVuaXQgaGVpZ2h0
QWJvdmVCYXNlbGluZSwgTGF5b3V0VW5pdCBkZXB0aEJlbG93QmFzZWxpbmUpCiB7CiAgICAgQVNT
RVJUKGhhc09wZXJhdG9yRmxhZyhNYXRoTUxPcGVyYXRvckRpY3Rpb25hcnk6OlN0cmV0Y2h5KSk7
CkBAIC0zMDYsOCArMjk0LDggQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZVBy
ZWZlcnJlZExvZ2ljYWxXaWR0aHMoKQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgR2x5
cGhEYXRhIGRhdGEgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KG1fdGV4dENvbnRlbnQsICFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSk7Ci0gICAg
ZmxvYXQgbWF4aW11bUdseXBoV2lkdGggPSBhZHZhbmNlV2lkdGhGb3JHbHlwaChkYXRhKTsKKyAg
ICBHbHlwaERhdGEgYmFzZUdseXBoOworICAgIGZsb2F0IG1heGltdW1HbHlwaFdpZHRoID0gZ2V0
QmFzZUdseXBoKHN0eWxlKCksIGJhc2VHbHlwaCkgPyBhZHZhbmNlV2lkdGhGb3JHbHlwaChiYXNl
R2x5cGgpIDogMDsKICAgICBpZiAoIW1faXNWZXJ0aWNhbCkgewogICAgICAgICBpZiAobWF4aW11
bUdseXBoV2lkdGggPCBzdHJldGNoU2l6ZSgpKQogICAgICAgICAgICAgbWF4aW11bUdseXBoV2lk
dGggPSBzdHJldGNoU2l6ZSgpOwpAQCAtMzE3LDEyICszMDUsMTIgQEAgdm9pZCBSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6Y29tcHV0ZVByZWZlcnJlZExvZ2ljYWxXaWR0aHMoKQogICAgIH0KICAgICBp
ZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSkgewogICAgICAgICAvLyBMYXJnZSBv
cGVyYXRvcnMgaW4gU1RJWCBXb3JkIGhhdmUgaW5jb3JyZWN0IGFkdmFuY2Ugd2lkdGgsIGNhdXNp
bmcgbWlzcGxhY2VtZW50IG9mIHN1cGVyc2NyaXB0LCBzbyB3ZSB1c2UgdGhlIGdseXBoIGJvdW5k
IGluc3RlYWQgKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zdGl4Zm9udHMvdHJhY2tpbmcvNDkv
KS4KLSAgICAgICAgU3RyZXRjaHlEYXRhIGxhcmdlT3BlcmF0b3IgPSBnZXREaXNwbGF5U3R5bGVM
YXJnZU9wZXJhdG9yKG1fdGV4dENvbnRlbnQpOwotICAgICAgICBpZiAobGFyZ2VPcGVyYXRvci5t
b2RlKCkgPT0gRHJhd1NpemVWYXJpYW50KQotICAgICAgICAgICAgbWF4aW11bUdseXBoV2lkdGgg
PSBib3VuZHNGb3JHbHlwaChsYXJnZU9wZXJhdG9yLnZhcmlhbnQoKSkud2lkdGgoKTsKKyAgICAg
ICAgZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKKyAgICAgICAgaWYgKG1fc3RyZXRj
aFR5cGUgPT0gU2l6ZVZhcmlhbnQpCisgICAgICAgICAgICBtYXhpbXVtR2x5cGhXaWR0aCA9IGJv
dW5kc0ZvckdseXBoKG1fdmFyaWFudCkud2lkdGgoKTsKICAgICB9IGVsc2UgewogICAgICAgICAv
LyBGSVhNRTogc29tZSBnbHlwaHMgKGUuZy4gdGhlIG9uZSBmb3IgIkZSQUNUSU9OIFNMQVNIIiBp
biB0aGUgU1RJWCBNYXRoIGZvbnQgb3IgbGFyZ2Ugb3BlcmF0b3JzKSBoYXZlIGEgd2lkdGggdGhh
dCBkZXBlbmRzIG9uIHRoZSBoZWlnaHQsIHJlc3VsdGluZyBpbiBsYXJnZSBnYXBzIChodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMzI2KS4KLSAgICAgICAgZmluZFN0
cmV0Y2h5RGF0YShtX3RleHRDb250ZW50LCAmbWF4aW11bUdseXBoV2lkdGgpOworICAgICAgICBm
aW5kU3RyZXRjaHlEYXRhKCZtYXhpbXVtR2x5cGhXaWR0aCk7CiAgICAgfQogICAgIG1fbWF4UHJl
ZmVycmVkTG9naWNhbFdpZHRoID0gbV9taW5QcmVmZXJyZWRMb2dpY2FsV2lkdGggPSBtX2xlYWRp
bmdTcGFjZSArIG1heGltdW1HbHlwaFdpZHRoICsgbV90cmFpbGluZ1NwYWNlOwogfQpAQCAtMzg2
LDEzICszNzQsMjcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c3R5bGVEaWRDaGFuZ2Uo
U3R5bGVEaWZmZXJlbmNlIGRpZmYsIGNvbnN0IFJlbmRlclN0eWwKICAgICB1cGRhdGVPcGVyYXRv
clByb3BlcnRpZXMoKTsKIH0KIAotYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhB
c3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+IGFz
c2VtYmx5UGFydHMsIFN0cmV0Y2h5RGF0YSYgc3RyZXRjaHlEYXRhKSBjb25zdAorYm9vbCBSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6Z2V0QmFzZUdseXBoKGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSwg
R2x5cGhEYXRhJiBiYXNlR2x5cGgpIGNvbnN0CiB7Ci0gICAgR2x5cGhEYXRhIHRvcDsKLSAgICBH
bHlwaERhdGEgZXh0ZW5zaW9uOwotICAgIEdseXBoRGF0YSBib3R0b207Ci0gICAgR2x5cGhEYXRh
IG1pZGRsZTsKKyAgICBiYXNlR2x5cGggPSBzdHlsZS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZv
ckNoYXJhY3RlcihtX3RleHRDb250ZW50LCAhc3R5bGUuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KTsKKyAgICByZXR1cm4gYmFzZUdseXBoLmlzVmFsaWQoKSAmJiBiYXNlR2x5cGguZm9udCA9PSAm
c3R5bGUuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgpOworfQorCit2b2lkIFJlbmRlck1hdGhN
TE9wZXJhdG9yOjpzZXRTaXplVmFyaWFudChjb25zdCBHbHlwaERhdGEmIHNpemVWYXJpYW50KQor
eworICAgIEFTU0VSVChzaXplVmFyaWFudC5pc1ZhbGlkKCkgJiYgc2l6ZVZhcmlhbnQuZm9udC0+
bWF0aERhdGEoKSk7CisgICAgbV9zdHJldGNoVHlwZSA9IFNpemVWYXJpYW50OworICAgIG1fdmFy
aWFudCA9IHNpemVWYXJpYW50OworfQorCit2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpzZXRH
bHlwaEFzc2VtYmx5KGNvbnN0IEdseXBoQXNzZW1ibHlEYXRhJiBhc3NlbWJseURhdGEpCit7Cisg
ICAgbV9zdHJldGNoVHlwZSA9IEdseXBoQXNzZW1ibHk7CisgICAgbV9hc3NlbWJseSA9IGFzc2Vt
Ymx5RGF0YTsKK30KIAorYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhBc3NlbWJs
eUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+IGFzc2VtYmx5
UGFydHMsIEdseXBoQXNzZW1ibHlEYXRhJiBhc3NlbWJseURhdGEpIGNvbnN0Cit7CiAgICAgLy8g
VGhlIHN0cnVjdHVyZSBvZiB0aGUgT3BlbiBUeXBlIE1hdGggdGFibGUgaXMgYSBiaXQgbW9yZSBn
ZW5lcmFsIHRoYW4gdGhlIG9uZSBjdXJyZW50bHkgdXNlZCBieSB0aGUgUmVuZGVyTWF0aE1MT3Bl
cmF0b3IgY29kZSwgc28gd2UgdHJ5IHRvIGZhbGxiYWNrIGluIGEgcmVhc29uYWJsZSB3YXkuCiAg
ICAgLy8gRklYTUU6IFJlbmRlck1hdGhNTE9wZXJhdG9yIHNob3VsZCBzdXBwb3J0IHRoZSBtb3N0
IGdlbmVyYWwgZm9ybWF0IChodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTMwMzI3KS4KICAgICAvLyBXZSB1c2UgdGhlIGFwcHJvYWNoIG9mIHRoZSBjb3B5Q29tcG9uZW50
cyBmdW5jdGlvbiBpbiBnaXRodWIuY29tL21hdGhqYXgvTWF0aEpheC1kZXYvYmxvYi9tYXN0ZXIv
Zm9udHMvT3BlblR5cGVNYXRoL2ZvbnRVdGlsLnB5CkBAIC00MDYsMTUyICs0MDgsMTY0IEBAIGJv
b2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8
T3BlblR5cGVNYXRoRGF0YTo6QXNzCiAgICAgaWYgKG5vbkV4dGVuZGVyQ291bnQgPiAzKQogICAg
ICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgaXMgbm90IHN1cHBvcnRlZDogdGhlcmUgYXJlIHRv
byBtYW55IHBpZWNlcy4KIAotICAgIC8vIFdlIG5vdyBicm93c2UgdGhlIGxpc3Qgb2YgcGllY2Vz
LgotICAgIC8vIDEgPSBsb29rIGZvciBhIGxlZnQvYm90dG9tIGdseXBoCi0gICAgLy8gMiA9IGxv
b2sgZm9yIGFuIGV4dGVuZGVyIGJldHdlZW4gbGVmdC9ib3R0b20gYW5kIG1pZAotICAgIC8vIDQg
PSBsb29rIGZvciBhIG1pZGRsZSBnbHlwaAotICAgIC8vIDUgPSBsb29rIGZvciBhbiBleHRlbmRl
ciBiZXR3ZWVuIG1pZGRsZSBhbmQgcmlnaHQvdG9wCi0gICAgLy8gNSA9IGxvb2sgZm9yIGEgcmln
aHQvdG9wIGdseXBoCi0gICAgLy8gNiA9IG5vIG1vcmUgcGllY2UgZXhwZWN0ZWQKLSAgICB1bnNp
Z25lZCBzdGF0ZSA9IDE7Ci0KLSAgICBleHRlbnNpb24uZ2x5cGggPSAwOwotICAgIG1pZGRsZS5n
bHlwaCA9IDA7CisgICAgLy8gV2Ugbm93IGJyb3dzZSB0aGUgbGlzdCBvZiBwaWVjZXMgZnJvbSBs
ZWZ0IHRvIHJpZ2h0IGZvciBob3Jpem9udGFsIG9wZXJhdG9ycyBhbmQgZnJvbSBib3R0b20gdG8g
dG9wIGZvciB2ZXJ0aWNhbCBvcGVyYXRvcnMuCisgICAgZW51bSBQYXJ0VHlwZSB7CisgICAgICAg
IFN0YXJ0LAorICAgICAgICBFeHRlbmRlckJldHdlZW5TdGFydEFuZE1pZGRsZSwKKyAgICAgICAg
TWlkZGxlLAorICAgICAgICBFeHRlbmRlckJldHdlZW5NaWRkbGVBbmRFbmQsCisgICAgICAgIEVu
ZCwKKyAgICAgICAgTm9uZQorICAgIH07CisgICAgUGFydFR5cGUgZXhwZWN0ZWQgPSBTdGFydDsK
KyAgICBhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoID0gMDsKKyAgICBhc3NlbWJseURhdGEu
bWlkZGxlLmdseXBoID0gMDsKICAgICBmb3IgKGF1dG8mIHBhcnQgOiBhc3NlbWJseVBhcnRzKSB7
Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gMiB8fCBzdGF0ZSA9PSAzKSAmJiBub25FeHRlbmRlckNv
dW50IDwgMykgewotICAgICAgICAgICAgLy8gV2UgZG8gbm90IHRyeSB0byBmaW5kIGEgbWlkZGxl
IGdseXBoLgotICAgICAgICAgICAgc3RhdGUgKz0gMjsKKyAgICAgICAgaWYgKG5vbkV4dGVuZGVy
Q291bnQgPCAzKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgYXQgbW9zdCB0d28g
bm9uLWV4dGVuZGVycyB0aGVuIHdlIHNraXAgdGhlIG1pZGRsZSBnbHlwaC4KKyAgICAgICAgICAg
IGlmIChleHBlY3RlZCA9PSBFeHRlbmRlckJldHdlZW5TdGFydEFuZE1pZGRsZSkKKyAgICAgICAg
ICAgICAgICBleHBlY3RlZCA9IEV4dGVuZGVyQmV0d2Vlbk1pZGRsZUFuZEVuZDsKKyAgICAgICAg
ICAgIGVsc2UgaWYgKGV4cGVjdGVkID09IE1pZGRsZSkKKyAgICAgICAgICAgICAgICBleHBlY3Rl
ZCA9IEVuZDsKICAgICAgICAgfQogICAgICAgICBpZiAocGFydC5pc0V4dGVuZGVyKSB7Ci0gICAg
ICAgICAgICBpZiAoIWV4dGVuc2lvbi5nbHlwaCkKLSAgICAgICAgICAgICAgICBleHRlbnNpb24u
Z2x5cGggPSBwYXJ0LmdseXBoOwotICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uLmdseXBo
ICE9IHBhcnQuZ2x5cGgpCisgICAgICAgICAgICBpZiAoIWFzc2VtYmx5RGF0YS5leHRlbnNpb24u
Z2x5cGgpCisgICAgICAgICAgICAgICAgYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaCA9IHBh
cnQuZ2x5cGg7IC8vIFdlIGNvcHkgdGhlIGV4dGVuZGVyIHBhcnQuCisgICAgICAgICAgICBlbHNl
IGlmIChhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoICE9IHBhcnQuZ2x5cGgpCiAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IHRoZSBhc3Nl
bWJseSBoYXMgZGlmZmVyZW50IGV4dGVuZGVycy4KIAotICAgICAgICAgICAgaWYgKHN0YXRlID09
IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBpZ25vcmUgbGVmdC9ib3R0b20gcGllY2UgYW5k
IG11bHRpcGxlIHN1Y2Nlc3NpdmUgZXh0ZW5kZXJzLgotICAgICAgICAgICAgICAgIHN0YXRlID0g
MjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gMykgewotICAgICAgICAgICAgICAg
IC8vIFdlIGlnbm9yZSBtaWRkbGUgcGllY2UgYW5kIG11bHRpcGxlIHN1Y2Nlc3NpdmUgZXh0ZW5k
ZXJzLgotICAgICAgICAgICAgICAgIHN0YXRlID0gNDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAo
c3RhdGUgPj0gNSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgaXMgbm90
IHN1cHBvcnRlZDogd2UgZ290IGFuIHVuZXhwZWN0ZWQgZXh0ZW5kZXIuCi0gICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIGNh
c2UgU3RhcnQ6CisgICAgICAgICAgICAgICAgLy8gV2UgaWdub3JlIHRoZSBsZWZ0L2JvdHRvbSBw
YXJ0LgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gRXh0ZW5kZXJCZXR3ZWVuU3RhcnRBbmRN
aWRkbGU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIE1pZGRs
ZToKKyAgICAgICAgICAgICAgICAvLyBXZSBpZ25vcmUgdGhlIG1pZGRsZSBwYXJ0LgorICAgICAg
ICAgICAgICAgIGV4cGVjdGVkID0gRXh0ZW5kZXJCZXR3ZWVuTWlkZGxlQW5kRW5kOworICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSBFbmQ6CisgICAgICAgICAgICBj
YXNlIE5vbmU6CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3VwcG9ydGVkOiB3ZSBn
b3QgYW4gdW5leHBlY3RlZCBleHRlbmRlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBjYXNlIEV4dGVuZGVyQmV0d2VlblN0YXJ0QW5kTWlkZGxlOgorICAgICAg
ICAgICAgY2FzZSBFeHRlbmRlckJldHdlZW5NaWRkbGVBbmRFbmQ6CisgICAgICAgICAgICAgICAg
Ly8gV2UgaWdub3JlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGV4dGVuZGVycy4KKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChz
dGF0ZSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoZXhwZWN0ZWQpIHsKKyAgICAgICAgY2FzZSBT
dGFydDoKICAgICAgICAgICAgIC8vIFdlIGNvcHkgdGhlIGxlZnQvYm90dG9tIHBhcnQuCi0gICAg
ICAgICAgICBib3R0b20uZ2x5cGggPSBwYXJ0LmdseXBoOwotICAgICAgICAgICAgc3RhdGUgPSAy
OworICAgICAgICAgICAgYXNzZW1ibHlEYXRhLmJvdHRvbS5nbHlwaCA9IHBhcnQuZ2x5cGg7Cisg
ICAgICAgICAgICBleHBlY3RlZCA9IEV4dGVuZGVyQmV0d2VlblN0YXJ0QW5kTWlkZGxlOwogICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGUgPT0gMiB8
fCBzdGF0ZSA9PSAzKSB7CisgICAgICAgIGNhc2UgRXh0ZW5kZXJCZXR3ZWVuU3RhcnRBbmRNaWRk
bGU6CisgICAgICAgIGNhc2UgTWlkZGxlOgogICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgbWlk
ZGxlIHBhcnQuCi0gICAgICAgICAgICBtaWRkbGUuZ2x5cGggPSBwYXJ0LmdseXBoOwotICAgICAg
ICAgICAgc3RhdGUgPSA0OworICAgICAgICAgICAgYXNzZW1ibHlEYXRhLm1pZGRsZS5nbHlwaCA9
IHBhcnQuZ2x5cGg7CisgICAgICAgICAgICBleHBlY3RlZCA9IEV4dGVuZGVyQmV0d2Vlbk1pZGRs
ZUFuZEVuZDsKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KHN0YXRlID09IDQgfHwgc3RhdGUgPT0gNSkgeworICAgICAgICBjYXNlIEV4dGVuZGVyQmV0d2Vl
bk1pZGRsZUFuZEVuZDoKKyAgICAgICAgY2FzZSBFbmQ6CiAgICAgICAgICAgICAvLyBXZSBjb3B5
IHRoZSByaWdodC90b3AgcGFydC4KLSAgICAgICAgICAgIHRvcC5nbHlwaCA9IHBhcnQuZ2x5cGg7
Ci0gICAgICAgICAgICBzdGF0ZSA9IDY7CisgICAgICAgICAgICBhc3NlbWJseURhdGEudG9wLmds
eXBoID0gcGFydC5nbHlwaDsKKyAgICAgICAgICAgIGV4cGVjdGVkID0gTm9uZTsKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIE5vbmU6CisgICAgICAgICAgICAvLyBUaGlzIGlz
IG5vdCBzdXBwb3J0ZWQ6IHdlIGdvdCBhbiB1bmV4cGVjdGVkIG5vbi1leHRlbmRlciBwYXJ0Lgor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFl
eHRlbnNpb24uZ2x5cGgpCisgICAgaWYgKCFhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoKQog
ICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgaXMgbm90IHN1cHBvcnRlZDogd2UgYWx3YXlz
IGFzc3VtZSB0aGF0IHdlIGhhdmUgYW4gZXh0ZW5zaW9uIGdseXBoLgogCiAgICAgLy8gSWYgd2Ug
ZG9uJ3QgaGF2ZSB0b3AvYm90dG9tIGdseXBocywgd2UgdXNlIHRoZSBleHRlbnNpb24gZ2x5cGgu
Ci0gICAgaWYgKCF0b3AuZ2x5cGgpCi0gICAgICAgIHRvcC5nbHlwaCA9IGV4dGVuc2lvbi5nbHlw
aDsKLSAgICBpZiAoIWJvdHRvbS5nbHlwaCkKLSAgICAgICAgYm90dG9tLmdseXBoID0gZXh0ZW5z
aW9uLmdseXBoOwotCi0gICAgdG9wLmZvbnQgPSAmc3R5bGUoKS5mb250Q2FzY2FkZSgpLnByaW1h
cnlGb250KCk7Ci0gICAgZXh0ZW5zaW9uLmZvbnQgPSB0b3AuZm9udDsKLSAgICBib3R0b20uZm9u
dCA9IHRvcC5mb250OwotICAgIGlmIChtaWRkbGUuZ2x5cGgpCi0gICAgICAgIG1pZGRsZS5mb250
ID0gdG9wLmZvbnQ7CisgICAgaWYgKCFhc3NlbWJseURhdGEudG9wLmdseXBoKQorICAgICAgICBh
c3NlbWJseURhdGEudG9wLmdseXBoID0gYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaDsKKyAg
ICBpZiAoIWFzc2VtYmx5RGF0YS5ib3R0b20uZ2x5cGgpCisgICAgICAgIGFzc2VtYmx5RGF0YS5i
b3R0b20uZ2x5cGggPSBhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoOwogCi0gICAgc3RyZXRj
aHlEYXRhLnNldEdseXBoQXNzZW1ibHlNb2RlKHRvcCwgZXh0ZW5zaW9uLCBib3R0b20sIG1pZGRs
ZSk7CisgICAgYXNzZW1ibHlEYXRhLnRvcC5mb250ID0gJnN0eWxlKCkuZm9udENhc2NhZGUoKS5w
cmltYXJ5Rm9udCgpOworICAgIGFzc2VtYmx5RGF0YS5leHRlbnNpb24uZm9udCA9IGFzc2VtYmx5
RGF0YS50b3AuZm9udDsKKyAgICBhc3NlbWJseURhdGEuYm90dG9tLmZvbnQgPSBhc3NlbWJseURh
dGEudG9wLmZvbnQ7CisgICAgYXNzZW1ibHlEYXRhLm1pZGRsZS5mb250ID0gYXNzZW1ibHlEYXRh
Lm1pZGRsZS5nbHlwaCA/IGFzc2VtYmx5RGF0YS50b3AuZm9udCA6IG51bGxwdHI7CiAKICAgICBy
ZXR1cm4gdHJ1ZTsKIH0KIAotUmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YSBSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6Z2V0RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcihVQ2hhciBjaGFy
YWN0ZXIpIGNvbnN0Cit2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaW5kRGlzcGxheVN0eWxl
TGFyZ2VPcGVyYXRvcigpCiB7Ci0gICAgU3RyZXRjaHlEYXRhIGRhdGE7Ci0KICAgICBBU1NFUlQo
bV9pc1ZlcnRpY2FsICYmIGlzTGFyZ2VPcGVyYXRvckluRGlzcGxheVN0eWxlKCkpOwogCi0gICAg
Y29uc3QgYXV0byYgcHJpbWFyeUZvbnQgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkucHJpbWFyeUZv
bnQoKTsKLSAgICBHbHlwaERhdGEgYmFzZUdseXBoID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmds
eXBoRGF0YUZvckNoYXJhY3RlcihjaGFyYWN0ZXIsICFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSk7Ci0gICAgaWYgKCFwcmltYXJ5Rm9udC5tYXRoRGF0YSgpIHx8IGJhc2VHbHlwaC5m
b250ICE9ICZwcmltYXJ5Rm9udCB8fCAhYmFzZUdseXBoLmZvbnQgfHwgIWJhc2VHbHlwaC5nbHlw
aCkKLSAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgR2x5cGhEYXRhIGJhc2VHbHlwaDsKKyAgICBp
ZiAoIWdldEJhc2VHbHlwaChzdHlsZSgpLCBiYXNlR2x5cGgpIHx8ICFiYXNlR2x5cGguZm9udC0+
bWF0aERhdGEoKSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgVmVjdG9yPEdseXBoPiBzaXplVmFy
aWFudHM7CiAgICAgVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4gYXNzZW1i
bHlQYXJ0czsKIAogICAgIC8vIFRoZSB2YWx1ZSBvZiBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQg
aXMgc29tZXRpbWVzIHRvbyBzbWFsbCwgc28gd2UgZW5zdXJlIHRoYXQgaXQgaXMgYXQgbGVhc3Qg
XHNxcnR7Mn0gdGltZXMgdGhlIHNpemUgb2YgdGhlIGJhc2UgZ2x5cGguCi0gICAgZmxvYXQgZGlz
cGxheU9wZXJhdG9yTWluSGVpZ2h0ID0gc3RkOjptYXgoYmFzZUdseXBoLmZvbnQtPmJvdW5kc0Zv
ckdseXBoKGJhc2VHbHlwaC5nbHlwaCkuaGVpZ2h0KCkgKiBzcXJ0T2ZUd29GbG9hdCwgcHJpbWFy
eUZvbnQubWF0aERhdGEoKS0+Z2V0TWF0aENvbnN0YW50KHByaW1hcnlGb250LCBPcGVuVHlwZU1h
dGhEYXRhOjpEaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQpKTsKKyAgICBmbG9hdCBkaXNwbGF5T3Bl
cmF0b3JNaW5IZWlnaHQgPSBzdGQ6Om1heChiYXNlR2x5cGguZm9udC0+Ym91bmRzRm9yR2x5cGgo
YmFzZUdseXBoLmdseXBoKS5oZWlnaHQoKSAqIHNxcnRPZlR3b0Zsb2F0LCBiYXNlR2x5cGguZm9u
dC0+bWF0aERhdGEoKS0+Z2V0TWF0aENvbnN0YW50KCpiYXNlR2x5cGguZm9udCwgT3BlblR5cGVN
YXRoRGF0YTo6RGlzcGxheU9wZXJhdG9yTWluSGVpZ2h0KSk7CiAKLSAgICBwcmltYXJ5Rm9udC5t
YXRoRGF0YSgpLT5nZXRNYXRoVmFyaWFudHMoYmFzZUdseXBoLmdseXBoLCB0cnVlLCBzaXplVmFy
aWFudHMsIGFzc2VtYmx5UGFydHMpOworICAgIGJhc2VHbHlwaC5mb250LT5tYXRoRGF0YSgpLT5n
ZXRNYXRoVmFyaWFudHMoYmFzZUdseXBoLmdseXBoLCB0cnVlLCBzaXplVmFyaWFudHMsIGFzc2Vt
Ymx5UGFydHMpOwogCiAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCBzaXplIHZhcmlhbnQgdGhh
dCBpcyBsYXJnZXIgdGhhbiB0aGUgZXhwZWN0ZWQgZGlzcGxheU9wZXJhdG9yTWluSGVpZ2h0IGFu
ZCBvdGhlcndpc2UgZmFsbGJhY2sgdG8gdGhlIGxhcmdlc3QgdmFyaWFudC4KLSAgICBmb3IgKGF1
dG8mIHZhcmlhbnQgOiBzaXplVmFyaWFudHMpIHsKLSAgICAgICAgR2x5cGhEYXRhIHNpemVWYXJp
YW50OwotICAgICAgICBzaXplVmFyaWFudC5nbHlwaCA9IHZhcmlhbnQ7Ci0gICAgICAgIHNpemVW
YXJpYW50LmZvbnQgPSAmcHJpbWFyeUZvbnQ7Ci0gICAgICAgIGRhdGEuc2V0U2l6ZVZhcmlhbnRN
b2RlKHNpemVWYXJpYW50KTsKLSAgICAgICAgaWYgKGJvdW5kc0ZvckdseXBoKHNpemVWYXJpYW50
KS5oZWlnaHQoKSA+PSBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQpCi0gICAgICAgICAgICByZXR1
cm4gZGF0YTsKKyAgICBmb3IgKGF1dG8mIHNpemVWYXJpYW50IDogc2l6ZVZhcmlhbnRzKSB7Cisg
ICAgICAgIEdseXBoRGF0YSBnbHlwaERhdGEoc2l6ZVZhcmlhbnQsIGJhc2VHbHlwaC5mb250KTsK
KyAgICAgICAgc2V0U2l6ZVZhcmlhbnQoZ2x5cGhEYXRhKTsKKyAgICAgICAgbV9pdGFsaWNDb3Jy
ZWN0aW9uID0gZ2x5cGhEYXRhLmZvbnQtPm1hdGhEYXRhKCktPmdldEl0YWxpY0NvcnJlY3Rpb24o
KmdseXBoRGF0YS5mb250LCBnbHlwaERhdGEuZ2x5cGgpOworICAgICAgICBpZiAoaGVpZ2h0Rm9y
R2x5cGgoZ2x5cGhEYXRhKSA+PSBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQpCisgICAgICAgICAg
ICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIGRhdGE7CiB9CiAKLVJlbmRlck1hdGhNTE9wZXJh
dG9yOjpTdHJldGNoeURhdGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRTdHJldGNoeURhdGEo
VUNoYXIgY2hhcmFjdGVyLCBmbG9hdCogbWF4aW11bUdseXBoV2lkdGgpCit2b2lkIFJlbmRlck1h
dGhNTE9wZXJhdG9yOjpmaW5kU3RyZXRjaHlEYXRhKGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0aCwg
TGF5b3V0VW5pdCB0YXJnZXRTaXplKQogewogICAgIEFTU0VSVCghbWF4aW11bUdseXBoV2lkdGgg
fHwgbV9pc1ZlcnRpY2FsKTsKIAotICAgIFN0cmV0Y2h5RGF0YSBkYXRhOwotICAgIFN0cmV0Y2h5
RGF0YSBhc3NlbWJseURhdGE7Ci0KLSAgICBjb25zdCBhdXRvJiBwcmltYXJ5Rm9udCA9IHN0eWxl
KCkuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgpOwotICAgIEdseXBoRGF0YSBiYXNlR2x5cGgg
PSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGNoYXJhY3Rlciwg
IXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKTsKKyAgICBHbHlwaERhdGEgYmFzZUds
eXBoOworICAgIGlmICghZ2V0QmFzZUdseXBoKHN0eWxlKCksIGJhc2VHbHlwaCkpCisgICAgICAg
IHJldHVybjsKICAgICAKLSAgICBpZiAocHJpbWFyeUZvbnQubWF0aERhdGEoKSAmJiBiYXNlR2x5
cGguZm9udCA9PSAmcHJpbWFyeUZvbnQpIHsKKyAgICBpZiAoIW1heGltdW1HbHlwaFdpZHRoKSB7
CisgICAgICAgIC8vIFdlIGRvIG5vdCBzdHJldGNoIGlmIHRoZSBiYXNlIGdseXBoIGlzIGxhcmdl
IGVub3VnaC4KKyAgICAgICAgZmxvYXQgYmFzZVNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRG
b3JHbHlwaChiYXNlR2x5cGgpIDogYWR2YW5jZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBoKTsKKyAg
ICAgICAgaWYgKHRhcmdldFNpemUgPD0gYmFzZVNpemUpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgR2x5cGhBc3NlbWJseURhdGEgYXNzZW1ibHlEYXRhOworICAgIGlmIChiYXNl
R2x5cGguZm9udC0+bWF0aERhdGEoKSkgewogICAgICAgICBWZWN0b3I8R2x5cGg+IHNpemVWYXJp
YW50czsKICAgICAgICAgVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4gYXNz
ZW1ibHlQYXJ0czsKLSAgICAgICAgcHJpbWFyeUZvbnQubWF0aERhdGEoKS0+Z2V0TWF0aFZhcmlh
bnRzKGJhc2VHbHlwaC5nbHlwaCwgbV9pc1ZlcnRpY2FsLCBzaXplVmFyaWFudHMsIGFzc2VtYmx5
UGFydHMpOworICAgICAgICBiYXNlR2x5cGguZm9udC0+bWF0aERhdGEoKS0+Z2V0TWF0aFZhcmlh
bnRzKGJhc2VHbHlwaC5nbHlwaCwgbV9pc1ZlcnRpY2FsLCBzaXplVmFyaWFudHMsIGFzc2VtYmx5
UGFydHMpOwogICAgICAgICAvLyBXZSB2ZXJpZnkgdGhlIHNpemUgdmFyaWFudHMuCi0gICAgICAg
IGZvciAoYXV0byYgdmFyaWFudCA6IHNpemVWYXJpYW50cykgewotICAgICAgICAgICAgR2x5cGhE
YXRhIHNpemVWYXJpYW50OwotICAgICAgICAgICAgc2l6ZVZhcmlhbnQuZ2x5cGggPSB2YXJpYW50
OwotICAgICAgICAgICAgc2l6ZVZhcmlhbnQuZm9udCA9ICZwcmltYXJ5Rm9udDsKKyAgICAgICAg
Zm9yIChhdXRvJiBzaXplVmFyaWFudCA6IHNpemVWYXJpYW50cykgeworICAgICAgICAgICAgR2x5
cGhEYXRhIGdseXBoRGF0YShzaXplVmFyaWFudCwgYmFzZUdseXBoLmZvbnQpOwogICAgICAgICAg
ICAgaWYgKG1heGltdW1HbHlwaFdpZHRoKQotICAgICAgICAgICAgICAgICptYXhpbXVtR2x5cGhX
aWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgo
c2l6ZVZhcmlhbnQpKTsKKyAgICAgICAgICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6
Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGdseXBoRGF0YSkp
OwogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXRTaXplVmFyaWFu
dE1vZGUoc2l6ZVZhcmlhbnQpOwotICAgICAgICAgICAgICAgIGZsb2F0IHNpemUgPSBtX2lzVmVy
dGljYWwgPyBoZWlnaHRGb3JHbHlwaChzaXplVmFyaWFudCkgOiBhZHZhbmNlV2lkdGhGb3JHbHlw
aChzaXplVmFyaWFudCk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZVZhcmlhbnQoZ2x5cGhEYXRh
KTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzaXplID0gbV9pc1ZlcnRpY2FsID8gaGVpZ2h0Rm9y
R2x5cGgoZ2x5cGhEYXRhKSA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGdseXBoRGF0YSk7CiAgICAg
ICAgICAgICAgICAgaWYgKHNpemUgPj0gc3RyZXRjaFNpemUoKSkgCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAg
ICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXZSB2ZXJpZnkgaWYgdGhlcmUgaXMgYSBjb25z
dHJ1Y3Rpb24uCiAgICAgICAgIGlmICghZ2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKGFzc2VtYmx5
UGFydHMsIGFzc2VtYmx5RGF0YSkpCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAg
ICAgIHJldHVybjsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIW1faXNWZXJ0aWNhbCkKLSAg
ICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8v
IElmIHRoZSBmb250IGRvZXMgbm90IGhhdmUgYSBNQVRIIHRhYmxlLCB3ZSBmYWxsYmFjayB0byB0
aGUgVW5pY29kZS1vbmx5IGNvbnN0cnVjdGlvbnMuCiAgICAgICAgIGNvbnN0IFN0cmV0Y2h5Q2hh
cmFjdGVyKiBzdHJldGNoeUNoYXJhY3RlciA9IG51bGxwdHI7CiAgICAgICAgIGNvbnN0IHVuc2ln
bmVkIG1heEluZGV4ID0gV1RGX0FSUkFZX0xFTkdUSChzdHJldGNoeUNoYXJhY3RlcnMpOwogICAg
ICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gMDsgaW5kZXggPCBtYXhJbmRleDsgKytpbmRleCkg
ewotICAgICAgICAgICAgaWYgKHN0cmV0Y2h5Q2hhcmFjdGVyc1tpbmRleF0uY2hhcmFjdGVyID09
IGNoYXJhY3RlcikgeworICAgICAgICAgICAgaWYgKHN0cmV0Y2h5Q2hhcmFjdGVyc1tpbmRleF0u
Y2hhcmFjdGVyID09IG1fdGV4dENvbnRlbnQpIHsKICAgICAgICAgICAgICAgICBzdHJldGNoeUNo
YXJhY3RlciA9ICZzdHJldGNoeUNoYXJhY3RlcnNbaW5kZXhdOwogICAgICAgICAgICAgICAgIGlm
ICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgJiYgaW5kZXggPCBsZWZ0UmlnaHRQ
YWlyc0NvdW50ICogMikgewogICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gcmln
aHQtdG8tbGVmdCBkaXJlY3Rpb24gd2Ugc2VsZWN0IHRoZSBtaXJyb3JlZCBmb3JtIGJ5IGFkZGlu
ZyAtMSBvciArMSBhY2NvcmRpbmcgdG8gdGhlIHBhcml0eSBvZiBpbmRleC4KQEAgLTU2Myw0NSAr
NTc3LDMyIEBAIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGEgUmVuZGVyTWF0aE1M
T3BlcmF0b3I6OmZpbmRTdHJldGNoeURhdGEoVUNoYXIKIAogICAgICAgICAvLyBJZiB3ZSBkaWRu
J3QgZmluZCBhIHN0cmV0Y2h5IGNoYXJhY3RlciBzZXQgZm9yIHRoaXMgY2hhcmFjdGVyLCB3ZSBk
b24ndCBrbm93IGhvdyB0byBzdHJldGNoIGl0LgogICAgICAgICBpZiAoIXN0cmV0Y2h5Q2hhcmFj
dGVyKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICByZXR1cm47CiAKICAg
ICAgICAgLy8gV2UgY29udmVydCB0aGUgbGlzdCBvZiBVbmljb2RlIGNoYXJhY3RlcnMgaW50byBh
IGxpc3Qgb2YgZ2x5cGggZGF0YS4KLSAgICAgICAgR2x5cGhEYXRhIHRvcCA9IHN0eWxlKCkuZm9u
dENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPnRvcENo
YXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIGV4dGVuc2lvbiA9IHN0eWxlKCkuZm9udENh
c2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPmV4dGVuc2lv
bkNoYXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIGJvdHRvbSA9IHN0eWxlKCkuZm9udENh
c2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPmJvdHRvbUNo
YXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIG1pZGRsZTsKLSAgICAgICAgaWYgKHN0cmV0
Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFyKQotICAgICAgICAgICAgbWlkZGxlID0gc3R5bGUoKS5m
b250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNoYXJhY3Rlci0+bWlk
ZGxlQ2hhciwgZmFsc2UpOwotICAgICAgICBhc3NlbWJseURhdGEuc2V0R2x5cGhBc3NlbWJseU1v
ZGUodG9wLCBleHRlbnNpb24sIGJvdHRvbSwgbWlkZGxlKTsKKyAgICAgICAgYXNzZW1ibHlEYXRh
LnRvcCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRj
aHlDaGFyYWN0ZXItPnRvcENoYXIsIGZhbHNlKTsKKyAgICAgICAgYXNzZW1ibHlEYXRhLmV4dGVu
c2lvbiA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRj
aHlDaGFyYWN0ZXItPmV4dGVuc2lvbkNoYXIsIGZhbHNlKTsKKyAgICAgICAgYXNzZW1ibHlEYXRh
LmJvdHRvbSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3Ry
ZXRjaHlDaGFyYWN0ZXItPmJvdHRvbUNoYXIsIGZhbHNlKTsKKyAgICAgICAgYXNzZW1ibHlEYXRh
Lm1pZGRsZSA9IHN0cmV0Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFyID8gc3R5bGUoKS5mb250Q2Fz
Y2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNoYXJhY3Rlci0+bWlkZGxlQ2hh
ciwgZmFsc2UpIDogR2x5cGhEYXRhKCk7CiAgICAgfQogCi0gICAgQVNTRVJUKGFzc2VtYmx5RGF0
YS5tb2RlKCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotCiAgICAgLy8gSWYgd2UgYXJlIG1lYXN1
cmluZyB0aGUgbWF4aW11bSB3aWR0aCwgdmVyaWZ5IGVhY2ggY29tcG9uZW50LgogICAgIGlmICht
YXhpbXVtR2x5cGhXaWR0aCkgewotICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1h
eCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS50
b3AoKSkpOwotICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUds
eXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5leHRlbnNpb24oKSkp
OwotICAgICAgICBpZiAoYXNzZW1ibHlEYXRhLm1pZGRsZSgpLmdseXBoKQotICAgICAgICAgICAg
Km1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNl
V2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKCkpKTsKLSAgICAgICAgKm1heGltdW1H
bHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JH
bHlwaChhc3NlbWJseURhdGEuYm90dG9tKCkpKTsKLSAgICAgICAgcmV0dXJuIGFzc2VtYmx5RGF0
YTsKKyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdp
ZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEudG9wKSk7CisgICAgICAgICpt
YXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmV4dGVuc2lvbikpOworICAgICAgICAqbWF4aW11bUds
eXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckds
eXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpKTsKKyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0g
c3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJs
eURhdGEuYm90dG9tKSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvLyBXZSBlbnN1
cmUgdGhhdCB0aGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2ggdG8gYXZvaWQgZ2x5cGggb3ZlcmxhcHMu
Ci0gICAgZmxvYXQgc2l6ZTsKLSAgICBpZiAobV9pc1ZlcnRpY2FsKSB7Ci0gICAgICAgIHNpemUg
PSBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEudG9wKCkpICsgaGVpZ2h0Rm9yR2x5cGgoYXNz
ZW1ibHlEYXRhLmJvdHRvbSgpKTsKLSAgICAgICAgaWYgKGFzc2VtYmx5RGF0YS5taWRkbGUoKS5n
bHlwaCkKLSAgICAgICAgICAgIHNpemUgKz0gaGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1p
ZGRsZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplID0gYWR2YW5jZVdpZHRoRm9yR2x5
cGgoYXNzZW1ibHlEYXRhLmxlZnQoKSkgKyBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURh
dGEucmlnaHQoKSk7Ci0gICAgICAgIGlmIChhc3NlbWJseURhdGEubWlkZGxlKCkuZ2x5cGgpCi0g
ICAgICAgICAgICBzaXplICs9IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRk
bGUoKSk7Ci0gICAgfQotICAgIGlmIChzaXplID4gc3RyZXRjaFNpemUoKSkKLSAgICAgICAgcmV0
dXJuIGRhdGE7CisgICAgZmxvYXQgbWluU2l6ZSA9IG1faXNWZXJ0aWNhbCA/CisgICAgICAgIGhl
aWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS50b3ApICsgaGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlE
YXRhLm1pZGRsZSkgKyBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEuYm90dG9tKQorICAgICAg
ICA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5sZWZ0KSArIGFkdmFuY2VXaWR0
aEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpICsgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNz
ZW1ibHlEYXRhLnJpZ2h0KTsKKyAgICBpZiAobWluU2l6ZSA+IHRhcmdldFNpemUpCisgICAgICAg
IHJldHVybjsKIAotICAgIHJldHVybiBhc3NlbWJseURhdGE7CisgICAgc2V0R2x5cGhBc3NlbWJs
eShhc3NlbWJseURhdGEpOwogfQogCiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVT
dHlsZSgpCkBAIC02MTAsNyArNjExLDggQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBk
YXRlU3R5bGUoKQogICAgIGlmICghZmlyc3RDaGlsZCgpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBtX3N0cmV0Y2h5RGF0YS5zZXROb3JtYWxNb2RlKCk7CisgICAgbV9zdHJldGNoVHlwZSA9IFVu
c3RyZXRjaGVkOworICAgIG1faXRhbGljQ29ycmVjdGlvbiA9IDA7CiAgICAgLy8gV2UgYWRkIHNw
YWNpbmcgYXJvdW5kIHRoZSBvcGVyYXRvci4KICAgICAvLyBGSVhNRTogVGhlIHNwYWNpbmcgc2hv
dWxkIGJlIGFkZGVkIHRvIHRoZSB3aG9sZSBlbWJlbGxpc2hlZCBvcGVyYXRvciAoaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDgzMSkuCiAgICAgLy8gRklYTUU6IFRo
ZSBzcGFjaW5nIHNob3VsZCBvbmx5IGJlIGFkZGVkIGluc2lkZSAocGVyaGFwcyBpbmZlcnJlZCkg
bXJvdyAoaHR0cDovL3d3dy53My5vcmcvVFIvTWF0aE1ML2NoYXB0ZXIzLmh0bWwjcHJlc20ub3Bz
cGFjaW5nKS4KQEAgLTYyNSwyNyArNjI3LDI0IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6
OnVwZGF0ZVN0eWxlKCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKG1faXNWZXJ0aWNhbCAm
JiBpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKQotICAgICAgICBtX3N0cmV0Y2h5RGF0
YSA9IGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IobV90ZXh0Q29udGVudCk7CisgICAgICAg
IGZpbmREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7CiAgICAgZWxzZSB7Ci0gICAgICAgIC8v
IFdlIGRvIG5vdCBzdHJldGNoIGlmIHRoZSBiYXNlIGdseXBoIGlzIGxhcmdlIGVub3VnaC4KLSAg
ICAgICAgR2x5cGhEYXRhIGJhc2VHbHlwaCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIobV90ZXh0Q29udGVudCwgIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpKTsKLSAgICAgICAgZmxvYXQgYmFzZVNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRG
b3JHbHlwaChiYXNlR2x5cGgpIDogYWR2YW5jZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBoKTsKLSAg
ICAgICAgaWYgKHN0cmV0Y2hTaXplKCkgPD0gYmFzZVNpemUpCisgICAgICAgIGZpbmRTdHJldGNo
eURhdGEobnVsbHB0ciwgc3RyZXRjaFNpemUoKSk7CisgICAgICAgIGlmIChtX3N0cmV0Y2hUeXBl
ID09IFVuc3RyZXRjaGVkKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3N0cmV0Y2h5
RGF0YSA9IGZpbmRTdHJldGNoeURhdGEobV90ZXh0Q29udGVudCwgbnVsbHB0cik7CiAgICAgfQog
Ci0gICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1Np
emVWYXJpYW50KSB7CisgICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2hUeXBlID09IFNp
emVWYXJpYW50KSB7CiAgICAgICAgIC8vIFdlIHJlc2l6ZSB0aGUgb3BlcmF0b3IgdG8gbWF0Y2gg
dGhlIG9uZSBvZiB0aGUgc2l6ZSB2YXJpYW50LgogICAgICAgICBpZiAoaXNMYXJnZU9wZXJhdG9y
SW5EaXNwbGF5U3R5bGUoKSkgewotICAgICAgICAgICAgLy8gVGhlIHN0cmV0Y2ggc2l6ZSBpcyBh
Y3R1YWxseSBub3QgaW52b2x2ZWQgaW4gdGhlIHNlbGVjdGlvbiBvZiB0aGUgc2l6ZSB2YXJpYW50
IGluIGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCisgICAgICAgICAgICAvLyBUaGUgc3Ry
ZXRjaCBzaXplIGlzIGFjdHVhbGx5IG5vdCBpbnZvbHZlZCBpbiB0aGUgc2VsZWN0aW9uIG9mIHRo
ZSBzaXplIHZhcmlhbnQgaW4gZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCiAgICAgICAg
ICAgICAvLyBXZSBzaW1wbHkgdXNlIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBzZWxlY3Rl
ZCBzaXplIHZhcmlhbnQgZ2x5cGguCi0gICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMg
PSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOworICAgICAgICAgICAg
RmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KTsKICAgICAg
ICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSAtZ2x5cGhCb3VuZHMueSgpOwog
ICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0gZ2x5cGhCb3VuZHMubWF4
WSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2UgcmVzY2FsZSB0aGUgaGVp
Z2h0IGFuZCBkZXB0aCBwcm9wb3J0aW9uYXRlbHkuCi0gICAgICAgICAgICBmbG9hdCB2YXJpYW50
U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAg
ICAgICBmbG9hdCB2YXJpYW50U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fdmFyaWFudCk7CiAgICAg
ICAgICAgICBmbG9hdCBzaXplID0gc3RyZXRjaFNpemUoKTsKICAgICAgICAgICAgIGZsb2F0IGFz
cGVjdCA9IHNpemUgPiAwID8gdmFyaWFudFNpemUgLyBzaXplIDogMS4wOwogICAgICAgICAgICAg
bV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSAqPSBhc3BlY3Q7CkBAIC02NTQsMzAgKzY1Mywz
MCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgfQogCiAg
ICAgaWYgKCFtX2lzVmVydGljYWwpIHsKLSAgICAgICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUo
KSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsKLSAgICAgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5k
cyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgIGlm
IChtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJpYW50KSB7CisgICAgICAgICAgICBGbG9hdFJlY3Qg
Z2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3ZhcmlhbnQpOwogICAgICAgICAgICAgbV9z
dHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSA9IC1nbHlwaEJvdW5kcy55KCk7CiAgICAgICAgICAg
ICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBnbHlwaEJvdW5kcy5tYXhZKCk7Ci0gICAg
ICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlE
YXRhLnZhcmlhbnQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9zdHJldGNoeURhdGEubW9kZSgp
ID09IERyYXdHbHlwaEFzc2VtYmx5KSB7CisgICAgICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFk
dmFuY2VXaWR0aEZvckdseXBoKG1fdmFyaWFudCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9zdHJl
dGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KSB7CiAgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhC
b3VuZHM7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gMDsKICAg
ICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IDA7CiAKLSAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubGVmdCgpKTsKKyAg
ICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5sZWZ0KTsK
ICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlv
dXRVbml0PihtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsK
ICAgICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91
dFVuaXQ+KG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSwgZ2x5cGhCb3VuZHMubWF4WSgpKTsK
IAotICAgICAgICAgICAgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0
YS5yaWdodCgpKTsKKyAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9h
c3NlbWJseS5yaWdodCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5l
ID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWds
eXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUg
PSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBo
Qm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5
cGgobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCkpOworICAgICAgICAgICAgZ2x5cGhCb3VuZHMg
PSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5LmV4dGVuc2lvbik7CiAgICAgICAgICAgICBtX3N0
cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNo
SGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0
cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hE
ZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGlm
IChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgewotICAgICAgICAgICAgICAgIGdseXBo
Qm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubWlkZGxlKCkpOworICAgICAg
ICAgICAgaWYgKG1fYXNzZW1ibHkubWlkZGxlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5taWRkbGUpOwogICAgICAg
ICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRV
bml0PihtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAg
ICAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlv
dXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7
CiAgICAgICAgICAgICB9CkBAIC02ODcsMTQgKzY4NiwxNCBAQCB2b2lkIFJlbmRlck1hdGhNTE9w
ZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAKIE9wdGlvbmFsPGludD4gUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmZpcnN0TGluZUJhc2VsaW5lKCkgY29uc3QKIHsKLSAgICBpZiAobV9zdHJldGNoeURhdGEu
bW9kZSgpICE9IERyYXdOb3JtYWwpCisgICAgaWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNo
ZWQpCiAgICAgICAgIHJldHVybiBPcHRpb25hbDxpbnQ+KG1fc3RyZXRjaEhlaWdodEFib3ZlQmFz
ZWxpbmUpOwogICAgIHJldHVybiBSZW5kZXJNYXRoTUxUb2tlbjo6Zmlyc3RMaW5lQmFzZWxpbmUo
KTsKIH0KIAogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQo
TGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExvZ2ljYWxF
eHRlbnRDb21wdXRlZFZhbHVlcyYgY29tcHV0ZWRWYWx1ZXMpIGNvbnN0CiB7Ci0gICAgaWYgKG1f
c3RyZXRjaHlEYXRhLm1vZGUoKSAhPSBEcmF3Tm9ybWFsKQorICAgIGlmIChtX3N0cmV0Y2hUeXBl
ICE9IFVuc3RyZXRjaGVkKQogICAgICAgICBsb2dpY2FsSGVpZ2h0ID0gbV9zdHJldGNoSGVpZ2h0
QWJvdmVCYXNlbGluZSArIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZTsKICAgICBSZW5kZXJC
b3g6OmNvbXB1dGVMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQsIGxvZ2ljYWxUb3AsIGNvbXB1
dGVkVmFsdWVzKTsKIH0KQEAgLTcwOCw3ICs3MDcsNyBAQCBMYXlvdXRSZWN0IFJlbmRlck1hdGhN
TE9wZXJhdG9yOjpwYWludEdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QgR2x5cGhEYXRhJiBk
YQogCiAgICAgLy8gSW4gb3JkZXIgdG8gaGF2ZSBnbHlwaHMgZml0IHNudWdseSB3aXRoIG9uZSBh
bm90aGVyIHdlIHNuYXAgdGhlIGNvbm5lY3RpbmcgZWRnZXMgdG8gcGl4ZWwgYm91bmRhcmllcwog
ICAgIC8vIGFuZCB0cmltIG9mZiBvbmUgcGl4ZWwuIFRoZSBwaXhlbCB0cmltIGlzIHRvIGFjY291
bnQgZm9yIGZvbnRzIHRoYXQgaGF2ZSBlZGdlIHBpeGVscyB0aGF0IGhhdmUgbGVzcwotICAgIC8v
IHRoYW4gZnVsbCBjb3ZlcmFnZS4gVGhlc2UgZWRnZSBwaXhlbHMgY2FuIGludHJvZHVjZSBzbWFs
bCBzZWFtcyBiZXR3ZWVuIGNvbm5lY3RlZCBnbHlwaHMKKyAgICAvLyB0aGFuIGZ1bGwgY292ZXJh
Z2UuIFRoZXNlIGVkZ2UgcGl4ZWxzIGNhbiBpbnRyb2R1Y2Ugc21hbGwgc2VhbXMgYmV0d2VlbiBj
b25uZWN0ZWQgZ2x5cGhzLgogICAgIEZsb2F0UmVjdCBjbGlwQm91bmRzID0gaW5mby5yZWN0Owog
ICAgIHN3aXRjaCAodHJpbSkgewogICAgIGNhc2UgVHJpbVRvcDoKQEAgLTcxOSwxMyArNzE4LDEx
IEBAIExheW91dFJlY3QgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50R2x5cGgoUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBHbHlwaERhdGEmIGRhCiAgICAgICAgIGdseXBoUGFpbnRSZWN0LnNoaWZ0
TWF4WUVkZ2VUbyhnbHlwaFBhaW50UmVjdC5tYXhZKCkuZmxvb3IoKSAtIDEpOwogICAgICAgICBj
bGlwQm91bmRzLnNoaWZ0TWF4WUVkZ2VUbyhnbHlwaFBhaW50UmVjdC5tYXhZKCkpOwogICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFRyaW1Ub3BBbmRCb3R0b206IHsKLSAgICAgICAgTGF5b3V0VW5p
dCB0ZW1wID0gZ2x5cGhQYWludFJlY3QueSgpICsgMTsKLSAgICAgICAgZ2x5cGhQYWludFJlY3Qu
c2hpZnRZRWRnZVRvKHRlbXAuY2VpbCgpKTsKKyAgICBjYXNlIFRyaW1Ub3BBbmRCb3R0b206Cisg
ICAgICAgIGdseXBoUGFpbnRSZWN0LnNoaWZ0WUVkZ2VUbyhnbHlwaFBhaW50UmVjdC55KCkuY2Vp
bCgpICsgMSk7CiAgICAgICAgIGdseXBoUGFpbnRSZWN0LnNoaWZ0TWF4WUVkZ2VUbyhnbHlwaFBh
aW50UmVjdC5tYXhZKCkuZmxvb3IoKSAtIDEpOwogICAgICAgICBjbGlwQm91bmRzLnNoaWZ0WUVk
Z2VUbyhnbHlwaFBhaW50UmVjdC55KCkpOwogICAgICAgICBjbGlwQm91bmRzLnNoaWZ0TWF4WUVk
Z2VUbyhnbHlwaFBhaW50UmVjdC5tYXhZKCkpOwotICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAg
Y2FzZSBUcmltTGVmdDoKICAgICAgICAgZ2x5cGhQYWludFJlY3Quc2hpZnRYRWRnZVRvKGdseXBo
UGFpbnRSZWN0LngoKS5jZWlsKCkgKyAxKTsKQEAgLTczNSwxNCArNzMyLDEyIEBAIExheW91dFJl
Y3QgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50R2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25z
dCBHbHlwaERhdGEmIGRhCiAgICAgICAgIGdseXBoUGFpbnRSZWN0LnNoaWZ0TWF4WEVkZ2VUbyhn
bHlwaFBhaW50UmVjdC5tYXhYKCkuZmxvb3IoKSAtIDEpOwogICAgICAgICBjbGlwQm91bmRzLnNo
aWZ0TWF4WEVkZ2VUbyhnbHlwaFBhaW50UmVjdC5tYXhYKCkpOwogICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFRyaW1MZWZ0QW5kUmlnaHQ6IHsKLSAgICAgICAgTGF5b3V0VW5pdCB0ZW1wID0gZ2x5
cGhQYWludFJlY3QueCgpICsgMTsKLSAgICAgICAgZ2x5cGhQYWludFJlY3Quc2hpZnRYRWRnZVRv
KHRlbXAuY2VpbCgpKTsKKyAgICBjYXNlIFRyaW1MZWZ0QW5kUmlnaHQ6CisgICAgICAgIGdseXBo
UGFpbnRSZWN0LnNoaWZ0WEVkZ2VUbyhnbHlwaFBhaW50UmVjdC54KCkuY2VpbCgpICsgMSk7CiAg
ICAgICAgIGdseXBoUGFpbnRSZWN0LnNoaWZ0TWF4WEVkZ2VUbyhnbHlwaFBhaW50UmVjdC5tYXhY
KCkuZmxvb3IoKSAtIDEpOwogICAgICAgICBjbGlwQm91bmRzLnNoaWZ0WEVkZ2VUbyhnbHlwaFBh
aW50UmVjdC54KCkpOwogICAgICAgICBjbGlwQm91bmRzLnNoaWZ0TWF4WEVkZ2VUbyhnbHlwaFBh
aW50UmVjdC5tYXhYKCkpOwogICAgIH0KLSAgICB9CiAKICAgICAvLyBDbGlwcGluZyB0aGUgZW5j
bG9zaW5nIEludFJlY3QgYXZvaWRzIGFueSBwb3RlbnRpYWwgaXNzdWVzIGF0IGpvaW5lZCBlZGdl
cy4KICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoaW5mby5jb250ZXh0
KCkpOwpAQCAtNzU4LDggKzc1Myw4IEBAIExheW91dFJlY3QgUmVuZGVyTWF0aE1MT3BlcmF0b3I6
OnBhaW50R2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBHbHlwaERhdGEmIGRhCiB2b2lkIFJl
bmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJ
bmZvJiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgZnJvbSwgY29uc3QgTGF5b3V0UG9pbnQmIHRv
KQogewogICAgIEFTU0VSVChtX2lzVmVydGljYWwpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0
YS5tb2RlKCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0
YS5leHRlbnNpb24oKS5nbHlwaCk7CisgICAgQVNTRVJUKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhB
c3NlbWJseSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkuZXh0ZW5zaW9uLmlzVmFsaWQoKSk7CiAg
ICAgQVNTRVJUKGZyb20ueSgpIDw9IHRvLnkoKSk7CiAKICAgICAvLyBJZiB0aGVyZSBpcyBubyBz
cGFjZSBmb3IgdGhlIGV4dGVuc2lvbiBnbHlwaCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGlu
Zy4KQEAgLTc2OCw3ICs3NjMsNyBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0
aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25zdAogCiAgICAgR3Jh
cGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKGluZm8uY29udGV4dCgpKTsKIAotICAg
IEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmV4
dGVuc2lvbigpKTsKKyAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaCht
X2Fzc2VtYmx5LmV4dGVuc2lvbik7CiAKICAgICAvLyBDbGlwcGluZyB0aGUgZXh0ZW5kZXIgcmVn
aW9uIGhlcmUgYWxsb3dzIHVzIHRvIGRyYXcgdGhlIGJvdHRvbSBleHRlbmRlciBnbHlwaCBpbnRv
IHRoZQogICAgIC8vIHJlZ2lvbnMgb2YgdGhlIGJvdHRvbSBnbHlwaCB3aXRob3V0IHdvcnJ5aW5n
IGFib3V0IG92ZXJkcmF3IChoYWlyeSBwaXhlbHMpIGFuZCBzaW1wbGlmaWVzIGxhdGVyIGNsaXBw
aW5nLgpAQCAtNzgzLDcgKzc3OCw3IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxX
aXRoVmVydGljYWxFeHRlbnNpb25HbHlwaChQYWludEluZm8mIGluZm8sIGNvbnN0CiAgICAgRmxv
YXRSZWN0IGxhc3RQYWludGVkR2x5cGhSZWN0KGZyb20sIEZsb2F0U2l6ZSgpKTsKIAogICAgIHdo
aWxlIChsYXN0UGFpbnRlZEdseXBoUmVjdC5tYXhZKCkgPCB0by55KCkpIHsKLSAgICAgICAgbGFz
dFBhaW50ZWRHbHlwaFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmV4dGVu
c2lvbigpLCBnbHlwaE9yaWdpbiwgVHJpbVRvcEFuZEJvdHRvbSk7CisgICAgICAgIGxhc3RQYWlu
dGVkR2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LmV4dGVuc2lvbiwgZ2x5
cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOwogICAgICAgICBnbHlwaE9yaWdpbi5zZXRZKGds
eXBoT3JpZ2luLnkoKSArIGxhc3RQYWludGVkR2x5cGhSZWN0LmhlaWdodCgpKTsKIAogICAgICAg
ICAvLyBUaGVyZSdzIGEgY2hhbmNlIHRoYXQgaWYgdGhlIGZvbnQgc2l6ZSBpcyBzbWFsbCBlbm91
Z2ggdGhlIGdsdWUgZ2x5cGggaGFzIGJlZW4gcmVkdWNlZCB0byBhbiBlbXB0eSByZWN0YW5nbGUK
QEAgLTc5Niw4ICs3OTEsOCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aFZl
cnRpY2FsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25zdAogdm9pZCBSZW5kZXJN
YXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhIb3Jpem9udGFsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgZnJvbSwgY29uc3QgTGF5b3V0UG9pbnQmIHRvKQog
ewogICAgIEFTU0VSVCghbV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEu
bW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEu
ZXh0ZW5zaW9uKCkuZ2x5cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBlID09IEdseXBoQXNz
ZW1ibHkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LmV4dGVuc2lvbi5pc1ZhbGlkKCkpOwogICAg
IEFTU0VSVChmcm9tLngoKSA8PSB0by54KCkpOwogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc3Bh
Y2UgZm9yIHRoZSBleHRlbnNpb24gZ2x5cGgsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcu
CkBAIC04MTksNyArODE0LDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhI
b3Jpem9udGFsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb24KICAgICBGbG9hdFJl
Y3QgbGFzdFBhaW50ZWRHbHlwaFJlY3QoZnJvbSwgRmxvYXRTaXplKCkpOwogCiAgICAgd2hpbGUg
KGxhc3RQYWludGVkR2x5cGhSZWN0Lm1heFgoKSA8IHRvLngoKSkgewotICAgICAgICBsYXN0UGFp
bnRlZEdseXBoUmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9zdHJldGNoeURhdGEuZXh0ZW5zaW9u
KCksIGdseXBoT3JpZ2luLCBUcmltTGVmdEFuZFJpZ2h0KTsKKyAgICAgICAgbGFzdFBhaW50ZWRH
bHlwaFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fYXNzZW1ibHkuZXh0ZW5zaW9uLCBnbHlwaE9y
aWdpbiwgVHJpbUxlZnRBbmRSaWdodCk7CiAgICAgICAgIGdseXBoT3JpZ2luLnNldFgoZ2x5cGhP
cmlnaW4ueCgpICsgbGFzdFBhaW50ZWRHbHlwaFJlY3Qud2lkdGgoKSk7CiAKICAgICAgICAgLy8g
VGhlcmUncyBhIGNoYW5jZSB0aGF0IGlmIHRoZSBmb250IHNpemUgaXMgc21hbGwgZW5vdWdoIHRo
ZSBnbHVlIGdseXBoIGhhcyBiZWVuIHJlZHVjZWQgdG8gYW4gZW1wdHkgcmVjdGFuZ2xlCkBAIC04
MzMsMjAgKzgyOCwyMCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludChQYWludElu
Zm8mIGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldAogewogICAgIFJlbmRlck1h
dGhNTFRva2VuOjpwYWludChpbmZvLCBwYWludE9mZnNldCk7CiAKLSAgICBpZiAoaW5mby5jb250
ZXh0KCkucGFpbnRpbmdEaXNhYmxlZCgpIHx8IGluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVn
cm91bmQgfHwgc3R5bGUoKS52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBtX3N0cmV0Y2h5RGF0
YS5tb2RlKCkgPT0gRHJhd05vcm1hbCkKKyAgICBpZiAoaW5mby5jb250ZXh0KCkucGFpbnRpbmdE
aXNhYmxlZCgpIHx8IGluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgc3R5bGUo
KS52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBtX3N0cmV0Y2hUeXBlID09IFVuc3RyZXRjaGVk
KQogICAgICAgICByZXR1cm47CiAKICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRl
U2F2ZXIoaW5mby5jb250ZXh0KCkpOwogICAgIGluZm8uY29udGV4dCgpLnNldEZpbGxDb2xvcihz
dHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUNvbG9yKSk7CiAKLSAgICBp
ZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdTaXplVmFyaWFudCkgewotICAgICAgICBB
U1NFUlQobV9zdHJldGNoeURhdGEudmFyaWFudCgpLmdseXBoKTsKKyAgICBpZiAobV9zdHJldGNo
VHlwZSA9PSBTaXplVmFyaWFudCkgeworICAgICAgICBBU1NFUlQobV92YXJpYW50LmlzVmFsaWQo
KSk7CiAgICAgICAgIEdseXBoQnVmZmVyIGJ1ZmZlcjsKLSAgICAgICAgYnVmZmVyLmFkZChtX3N0
cmV0Y2h5RGF0YS52YXJpYW50KCkuZ2x5cGgsIG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5mb250
LCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpKTsKKyAgICAg
ICAgYnVmZmVyLmFkZChtX3ZhcmlhbnQuZ2x5cGgsIG1fdmFyaWFudC5mb250LCBhZHZhbmNlV2lk
dGhGb3JHbHlwaChtX3ZhcmlhbnQpKTsKICAgICAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JUb3BM
ZWZ0ID0gY2VpbGVkSW50UG9pbnQocGFpbnRPZmZzZXQgKyBsb2NhdGlvbigpKTsKLSAgICAgICAg
RmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEudmFy
aWFudCgpKTsKKyAgICAgICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgo
bV92YXJpYW50KTsKICAgICAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JPcmlnaW4ob3BlcmF0b3JU
b3BMZWZ0LngoKSwgb3BlcmF0b3JUb3BMZWZ0LnkoKSAtIGdseXBoQm91bmRzLnkoKSk7Ci0gICAg
ICAgIGluZm8uY29udGV4dCgpLmRyYXdHbHlwaHMoc3R5bGUoKS5mb250Q2FzY2FkZSgpLCAqbV9z
dHJldGNoeURhdGEudmFyaWFudCgpLmZvbnQsIGJ1ZmZlciwgMCwgMSwgb3BlcmF0b3JPcmlnaW4p
OworICAgICAgICBpbmZvLmNvbnRleHQoKS5kcmF3R2x5cGhzKHN0eWxlKCkuZm9udENhc2NhZGUo
KSwgKm1fdmFyaWFudC5mb250LCBidWZmZXIsIDAsIDEsIG9wZXJhdG9yT3JpZ2luKTsKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIApAQCAtODU5LDMwICs4NTQsMzAgQEAgdm9pZCBSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6cGFpbnQoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFp
bnRPZmZzZXQKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFz
c2VtYmx5KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0KQog
ewogICAgIEFTU0VSVChtX2lzVmVydGljYWwpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5t
b2RlKCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS50
b3AoKS5nbHlwaCk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLmJvdHRvbSgpLmdseXBoKTsK
KyAgICBBU1NFUlQobV9zdHJldGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KTsKKyAgICBBU1NFUlQo
bV9hc3NlbWJseS50b3AuaXNWYWxpZCgpKTsKKyAgICBBU1NFUlQobV9hc3NlbWJseS5ib3R0b20u
aXNWYWxpZCgpKTsKIAogICAgIC8vIFdlIGFyZSBwb3NpdGlvbmluZyB0aGUgZ2x5cGhzIHNvIHRo
YXQgdGhlIGVkZ2Ugb2YgdGhlIHRpZ2h0IGdseXBoIGJvdW5kcyBsaW5lIHVwIGV4YWN0bHkgd2l0
aCB0aGUgZWRnZXMgb2Ygb3VyIHBhaW50IGJveC4KICAgICBMYXlvdXRQb2ludCBvcGVyYXRvclRv
cExlZnQgPSBwYWludE9mZnNldCArIGxvY2F0aW9uKCk7CiAgICAgb3BlcmF0b3JUb3BMZWZ0Lm1v
dmUoc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBtX2xlYWRpbmdTcGFjZSA6IG1f
dHJhaWxpbmdTcGFjZSwgMCk7CiAgICAgb3BlcmF0b3JUb3BMZWZ0ID0gY2VpbGVkSW50UG9pbnQo
b3BlcmF0b3JUb3BMZWZ0KTsKLSAgICBGbG9hdFJlY3QgdG9wR2x5cGhCb3VuZHMgPSBib3VuZHNG
b3JHbHlwaChtX3N0cmV0Y2h5RGF0YS50b3AoKSk7CisgICAgRmxvYXRSZWN0IHRvcEdseXBoQm91
bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS50b3ApOwogICAgIExheW91dFBvaW50IHRv
cEdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgLSB0
b3BHbHlwaEJvdW5kcy55KCkpOwotICAgIExheW91dFJlY3QgdG9wR2x5cGhQYWludFJlY3QgPSBw
YWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLnRvcCgpLCB0b3BHbHlwaE9yaWdpbiwgVHJp
bUJvdHRvbSk7CisgICAgTGF5b3V0UmVjdCB0b3BHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgo
aW5mbywgbV9hc3NlbWJseS50b3AsIHRvcEdseXBoT3JpZ2luLCBUcmltQm90dG9tKTsKIAotICAg
IEZsb2F0UmVjdCBib3R0b21HbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlE
YXRhLmJvdHRvbSgpKTsKKyAgICBGbG9hdFJlY3QgYm90dG9tR2x5cGhCb3VuZHMgPSBib3VuZHNG
b3JHbHlwaChtX2Fzc2VtYmx5LmJvdHRvbSk7CiAgICAgTGF5b3V0UG9pbnQgYm90dG9tR2x5cGhP
cmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwgb3BlcmF0b3JUb3BMZWZ0LnkoKSArIG9mZnNldEhl
aWdodCgpIC0gKGJvdHRvbUdseXBoQm91bmRzLmhlaWdodCgpICsgYm90dG9tR2x5cGhCb3VuZHMu
eSgpKSk7Ci0gICAgTGF5b3V0UmVjdCBib3R0b21HbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgo
aW5mbywgbV9zdHJldGNoeURhdGEuYm90dG9tKCksIGJvdHRvbUdseXBoT3JpZ2luLCBUcmltVG9w
KTsKKyAgICBMYXlvdXRSZWN0IGJvdHRvbUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZv
LCBtX2Fzc2VtYmx5LmJvdHRvbSwgYm90dG9tR2x5cGhPcmlnaW4sIFRyaW1Ub3ApOwogCi0gICAg
aWYgKG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLmdseXBoKSB7CisgICAgaWYgKG1fYXNzZW1ibHku
bWlkZGxlLmlzVmFsaWQoKSkgewogICAgICAgICAvLyBDZW50ZXIgdGhlIGdseXBoIG9yaWdpbiBi
ZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGdseXBoIHBhaW50IGV4dGVudHMuIFRoZW4gc2hpZnQg
aXQgaGFsZiB0aGUgcGFpbnQgaGVpZ2h0IHRvd2FyZCB0aGUgYm90dG9tIGdseXBoLgotICAgICAg
ICBGbG9hdFJlY3QgbWlkZGxlR2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5
RGF0YS5taWRkbGUoKSk7CisgICAgICAgIEZsb2F0UmVjdCBtaWRkbGVHbHlwaEJvdW5kcyA9IGJv
dW5kc0ZvckdseXBoKG1fYXNzZW1ibHkubWlkZGxlKTsKICAgICAgICAgTGF5b3V0UG9pbnQgbWlk
ZGxlR2x5cGhPcmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwgdG9wR2x5cGhPcmlnaW4ueSgpKTsK
ICAgICAgICAgbWlkZGxlR2x5cGhPcmlnaW4ubW92ZUJ5KExheW91dFBvaW50KDAsIChib3R0b21H
bHlwaFBhaW50UmVjdC55KCkgLSB0b3BHbHlwaFBhaW50UmVjdC5tYXhZKCkpIC8gMi4wKSk7CiAg
ICAgICAgIG1pZGRsZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgwLCBtaWRkbGVHbHlw
aEJvdW5kcy5oZWlnaHQoKSAvIDIuMCkpOwogCi0gICAgICAgIExheW91dFJlY3QgbWlkZGxlR2x5
cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLCBt
aWRkbGVHbHlwaE9yaWdpbiwgVHJpbVRvcEFuZEJvdHRvbSk7CisgICAgICAgIExheW91dFJlY3Qg
bWlkZGxlR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fYXNzZW1ibHkubWlkZGxl
LCBtaWRkbGVHbHlwaE9yaWdpbiwgVHJpbVRvcEFuZEJvdHRvbSk7CiAgICAgICAgIGZpbGxXaXRo
VmVydGljYWxFeHRlbnNpb25HbHlwaChpbmZvLCB0b3BHbHlwaFBhaW50UmVjdC5taW5YTWF4WUNv
cm5lcigpLCBtaWRkbGVHbHlwaFBhaW50UmVjdC5taW5YTWluWUNvcm5lcigpKTsKICAgICAgICAg
ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKGluZm8sIG1pZGRsZUdseXBoUGFpbnRSZWN0
Lm1pblhNYXhZQ29ybmVyKCksIGJvdHRvbUdseXBoUGFpbnRSZWN0Lm1pblhNaW5ZQ29ybmVyKCkp
OwogICAgIH0gZWxzZQpAQCAtODkyLDI2ICs4ODcsMjYgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVy
YXRvcjo6cGFpbnRWZXJ0aWNhbEdseXBoQXNzZW1ibHkoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBM
YXkKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50SG9yaXpvbnRhbEdseXBoQXNzZW1i
bHkoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQpCiB7CiAg
ICAgQVNTRVJUKCFtX2lzVmVydGljYWwpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5tb2Rl
KCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5sZWZ0
KCkuZ2x5cGgpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5yaWdodCgpLmdseXBoKTsKKyAg
ICBBU1NFUlQobV9zdHJldGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KTsKKyAgICBBU1NFUlQobV9h
c3NlbWJseS5sZWZ0LmlzVmFsaWQoKSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkucmlnaHQuaXNW
YWxpZCgpKTsKIAogICAgIC8vIFdlIGFyZSBwb3NpdGlvbmluZyB0aGUgZ2x5cGhzIHNvIHRoYXQg
dGhlIGVkZ2Ugb2YgdGhlIHRpZ2h0IGdseXBoIGJvdW5kcyBsaW5lIHVwIGV4YWN0bHkgd2l0aCB0
aGUgZWRnZXMgb2Ygb3VyIHBhaW50IGJveC4KICAgICBMYXlvdXRQb2ludCBvcGVyYXRvclRvcExl
ZnQgPSBwYWludE9mZnNldCArIGxvY2F0aW9uKCk7CiAgICAgb3BlcmF0b3JUb3BMZWZ0Lm1vdmUo
bV9sZWFkaW5nU3BhY2UsIDApOwogICAgIG9wZXJhdG9yVG9wTGVmdCA9IGNlaWxlZEludFBvaW50
KG9wZXJhdG9yVG9wTGVmdCk7CiAgICAgTGF5b3V0UG9pbnQgbGVmdEdseXBoT3JpZ2luKG9wZXJh
dG9yVG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgKyBtX3N0cmV0Y2hIZWlnaHRBYm92
ZUJhc2VsaW5lKTsKLSAgICBMYXlvdXRSZWN0IGxlZnRHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5
cGgoaW5mbywgbV9zdHJldGNoeURhdGEubGVmdCgpLCBsZWZ0R2x5cGhPcmlnaW4sIFRyaW1SaWdo
dCk7CisgICAgTGF5b3V0UmVjdCBsZWZ0R2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8s
IG1fYXNzZW1ibHkubGVmdCwgbGVmdEdseXBoT3JpZ2luLCBUcmltUmlnaHQpOwogCi0gICAgRmxv
YXRSZWN0IHJpZ2h0R2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5y
aWdodCgpKTsKKyAgICBGbG9hdFJlY3QgcmlnaHRHbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBo
KG1fYXNzZW1ibHkucmlnaHQpOwogICAgIExheW91dFBvaW50IHJpZ2h0R2x5cGhPcmlnaW4ob3Bl
cmF0b3JUb3BMZWZ0LngoKSArIG9mZnNldFdpZHRoKCkgLSByaWdodEdseXBoQm91bmRzLndpZHRo
KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgKyBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lKTsK
LSAgICBMYXlvdXRSZWN0IHJpZ2h0R2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1f
c3RyZXRjaHlEYXRhLnJpZ2h0KCksIHJpZ2h0R2x5cGhPcmlnaW4sIFRyaW1MZWZ0KTsKKyAgICBM
YXlvdXRSZWN0IHJpZ2h0R2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fYXNzZW1i
bHkucmlnaHQsIHJpZ2h0R2x5cGhPcmlnaW4sIFRyaW1MZWZ0KTsKIAotICAgIGlmIChtX3N0cmV0
Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgeworICAgIGlmIChtX2Fzc2VtYmx5Lm1pZGRsZS5pc1Zh
bGlkKCkpIHsKICAgICAgICAgLy8gQ2VudGVyIHRoZSBnbHlwaCBvcmlnaW4gYmV0d2VlbiB0aGUg
c3RhcnQgYW5kIGVuZCBnbHlwaCBwYWludCBleHRlbnRzLgogICAgICAgICBMYXlvdXRQb2ludCBt
aWRkbGVHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBsZWZ0R2x5cGhPcmlnaW4ueSgp
KTsKICAgICAgICAgbWlkZGxlR2x5cGhPcmlnaW4ubW92ZUJ5KExheW91dFBvaW50KChyaWdodEds
eXBoUGFpbnRSZWN0LngoKSAtIGxlZnRHbHlwaFBhaW50UmVjdC5tYXhYKCkpIC8gMi4wLCAwKSk7
Ci0gICAgICAgIExheW91dFJlY3QgbWlkZGxlR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGlu
Zm8sIG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLCBtaWRkbGVHbHlwaE9yaWdpbiwgVHJpbUxlZnRB
bmRSaWdodCk7CisgICAgICAgIExheW91dFJlY3QgbWlkZGxlR2x5cGhQYWludFJlY3QgPSBwYWlu
dEdseXBoKGluZm8sIG1fYXNzZW1ibHkubWlkZGxlLCBtaWRkbGVHbHlwaE9yaWdpbiwgVHJpbUxl
ZnRBbmRSaWdodCk7CiAgICAgICAgIGZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKGlu
Zm8sIGxlZnRHbHlwaFBhaW50UmVjdC5tYXhYTWluWUNvcm5lcigpLCBtaWRkbGVHbHlwaFBhaW50
UmVjdC5taW5YTWluWUNvcm5lcigpKTsKICAgICAgICAgZmlsbFdpdGhIb3Jpem9udGFsRXh0ZW5z
aW9uR2x5cGgoaW5mbywgbWlkZGxlR2x5cGhQYWludFJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmln
aHRHbHlwaFBhaW50UmVjdC5taW5YTWluWUNvcm5lcigpKTsKICAgICB9IGVsc2UKQEAgLTkyMSw3
ICs5MTYsNyBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludEhvcml6b250YWxHbHlw
aEFzc2VtYmx5KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTAogdm9pZCBSZW5kZXJNYXRoTUxPcGVy
YXRvcjo6cGFpbnRDaGlsZHJlbihQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9p
bnQmIHBhaW50T2Zmc2V0LCBQYWludEluZm8mIHBhaW50SW5mb0ZvckNoaWxkLCBib29sIHVzZVBy
aW50UmVjdCkKIHsKICAgICAvLyBXZSBza2lwIHBhaW50aW5nIGZvciBpbnZpc2libGUgb3BlcmF0
b3JzIHRvbyB0byBhdm9pZCBzb21lICJtaXNzaW5nIGNoYXJhY3RlciIgZ2x5cGggdG8gYXBwZWFy
IGlmIGFwcHJvcHJpYXRlIG1hdGggZm9udHMgYXJlIG5vdCBhdmFpbGFibGUuCi0gICAgaWYgKG1f
c3RyZXRjaHlEYXRhLm1vZGUoKSAhPSBEcmF3Tm9ybWFsIHx8IGlzSW52aXNpYmxlT3BlcmF0b3Io
KSkKKyAgICBpZiAobV9zdHJldGNoVHlwZSAhPSBVbnN0cmV0Y2hlZCB8fCBpc0ludmlzaWJsZU9w
ZXJhdG9yKCkpCiAgICAgICAgIHJldHVybjsKICAgICBSZW5kZXJNYXRoTUxUb2tlbjo6cGFpbnRD
aGlsZHJlbihwYWludEluZm8sIHBhaW50T2Zmc2V0LCBwYWludEluZm9Gb3JDaGlsZCwgdXNlUHJp
bnRSZWN0KTsKIH0KQEAgLTkzNiwxOSArOTMxLDE5IEBAIExheW91dFVuaXQgUmVuZGVyTWF0aE1M
T3BlcmF0b3I6OnRyYWlsaW5nU3BhY2VFcnJvcigpCiAgICAgLy8gSGVuY2Ugd2UgZGV0ZXJtaW5l
IHRoZSBlcnJvciBpbiB0aGUgbG9naWNhbCB3aWR0aCB3aXRoIHJlc3BlY3QgdG8gdGhlIGFjdHVh
bCB3aWR0aCBvZiB0aGUgZ2x5cGgocykgdXNlZCB0byBwYWludCB0aGUgb3BlcmF0b3IuCiAgICAg
TGF5b3V0VW5pdCB3aWR0aCA9IGxvZ2ljYWxXaWR0aCgpOwogCi0gICAgaWYgKG1fc3RyZXRjaHlE
YXRhLm1vZGUoKSA9PSBEcmF3Tm9ybWFsKSB7CisgICAgaWYgKG1fc3RyZXRjaFR5cGUgPT0gVW5z
dHJldGNoZWQpIHsKICAgICAgICAgR2x5cGhEYXRhIGRhdGEgPSBzdHlsZSgpLmZvbnRDYXNjYWRl
KCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHRleHRDb250ZW50KCksICFzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSk7CiAgICAgICAgIHJldHVybiB3aWR0aCAtIGFkdmFuY2VXaWR0aEZv
ckdseXBoKGRhdGEpOwogICAgIH0KIAotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0g
RHJhd1NpemVWYXJpYW50KQotICAgICAgICByZXR1cm4gd2lkdGggLSBhZHZhbmNlV2lkdGhGb3JH
bHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOworICAgIGlmIChtX3N0cmV0Y2hUeXBlID09
IFNpemVWYXJpYW50KQorICAgICAgICByZXR1cm4gd2lkdGggLSBhZHZhbmNlV2lkdGhGb3JHbHlw
aChtX3ZhcmlhbnQpOwogCi0gICAgZmxvYXQgYXNzZW1ibHlXaWR0aCA9IGFkdmFuY2VXaWR0aEZv
ckdseXBoKG1fc3RyZXRjaHlEYXRhLnRvcCgpKTsKLSAgICBhc3NlbWJseVdpZHRoID0gc3RkOjpt
YXgoYXNzZW1ibHlXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEuYm90
dG9tKCkpKTsKLSAgICBhc3NlbWJseVdpZHRoID0gc3RkOjptYXgoYXNzZW1ibHlXaWR0aCwgYWR2
YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCkpKTsKLSAgICBpZiAo
bV9zdHJldGNoeURhdGEubWlkZGxlKCkuZ2x5cGgpCi0gICAgICAgIGFzc2VtYmx5V2lkdGggPSBz
dGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX3N0cmV0Y2h5RGF0
YS5taWRkbGUoKSkpOworICAgIGZsb2F0IGFzc2VtYmx5V2lkdGggPSBhZHZhbmNlV2lkdGhGb3JH
bHlwaChtX2Fzc2VtYmx5LnRvcCk7CisgICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2Vt
Ymx5V2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fYXNzZW1ibHkuYm90dG9tKSk7CisgICAg
YXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgsIGFkdmFuY2VXaWR0aEZvckds
eXBoKG1fYXNzZW1ibHkuZXh0ZW5zaW9uKSk7CisgICAgaWYgKG1fYXNzZW1ibHkubWlkZGxlLmlz
VmFsaWQoKSkKKyAgICAgICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgs
IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fYXNzZW1ibHkubWlkZGxlKSk7CiAgICAgcmV0dXJuIHdp
ZHRoIC0gYXNzZW1ibHlXaWR0aDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oIGIvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oCmluZGV4IGFhZWU0NmFkNTg2NDg3
MzQ5MzE0YzcxZWQ3YWQyNjkzYTdmOTE4ZjEuLjBiYWZhMmI1NWFhZTkwNjZhNjQ2NzA2NGYzOTU0
MGI0YjE3MDk3OGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MT3BlcmF0b3IuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0
aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmgKQEAgLTUxLDcgKzUxLDcgQEAgcHVibGljOgogICAg
IC8vIEZJWE1FOiBUaGUgZGlzcGxheXN0eWxlIHByb3BlcnR5IGlzIG5vdCBpbXBsZW1lbnRlZCAo
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExODczNykuCiAgICAgYm9v
bCBpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpIGNvbnN0IHsgcmV0dXJuICFoYXNPcGVy
YXRvckZsYWcoTWF0aE1MT3BlcmF0b3JEaWN0aW9uYXJ5OjpTdHJldGNoeSkgJiYgaGFzT3BlcmF0
b3JGbGFnKE1hdGhNTE9wZXJhdG9yRGljdGlvbmFyeTo6TGFyZ2VPcCk7IH0KICAgICBib29sIGlz
VmVydGljYWwoKSBjb25zdCB7IHJldHVybiBtX2lzVmVydGljYWw7IH0KLSAgICBMYXlvdXRVbml0
IGl0YWxpY0NvcnJlY3Rpb24oKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IGl0YWxpY0NvcnJlY3Rp
b24oKSBjb25zdCB7IHJldHVybiBtX2l0YWxpY0NvcnJlY3Rpb247IH0KIAogICAgIHZvaWQgc3R5
bGVEaWRDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlLCBjb25zdCBSZW5kZXJTdHlsZSogb2xkU3R5bGUp
IGZpbmFsOwogICAgIHZvaWQgdXBkYXRlU3R5bGUoKSBmaW5hbDsKQEAgLTczLDYwICs3MywzMSBA
QCBwcm90ZWN0ZWQ6CiAgICAgVUNoYXIgdGV4dENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHRDb250ZW50OyB9CiAKIHByaXZhdGU6Ci0gICAgZW51bSBEcmF3TW9kZSB7Ci0gICAgICAgIERy
YXdOb3JtYWwsIERyYXdTaXplVmFyaWFudCwgRHJhd0dseXBoQXNzZW1ibHkKKyAgICBzdHJ1Y3Qg
R2x5cGhBc3NlbWJseURhdGEgeworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBHbHlwaERh
dGEgdG9wOworICAgICAgICAgICAgR2x5cGhEYXRhIHJpZ2h0OworICAgICAgICB9OworICAgICAg
ICBHbHlwaERhdGEgZXh0ZW5zaW9uOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBHbHlw
aERhdGEgYm90dG9tOworICAgICAgICAgICAgR2x5cGhEYXRhIGxlZnQ7CisgICAgICAgIH07Cisg
ICAgICAgIEdseXBoRGF0YSBtaWRkbGU7CisgICAgR2x5cGhBc3NlbWJseURhdGEoKQorICAgIDog
dG9wKCksIGV4dGVuc2lvbigpLCBib3R0b20oKSwgbWlkZGxlKCkgeyB9CiAgICAgfTsKLQotICAg
IGNsYXNzIFN0cmV0Y2h5RGF0YSB7Ci0gICAgcHVibGljOgotICAgICAgICBEcmF3TW9kZSBtb2Rl
KCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIEdseXBoRGF0YSB2YXJpYW50KCkg
Y29uc3QgeyByZXR1cm4gbV9kYXRhWzBdOyB9Ci0gICAgICAgIEdseXBoRGF0YSB0b3AoKSBjb25z
dCB7IHJldHVybiBtX2RhdGFbMF07IH0KLSAgICAgICAgR2x5cGhEYXRhIGV4dGVuc2lvbigpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YVsxXTsgfQotICAgICAgICBHbHlwaERhdGEgYm90dG9tKCkgY29u
c3QgeyByZXR1cm4gbV9kYXRhWzJdOyB9Ci0gICAgICAgIEdseXBoRGF0YSBtaWRkbGUoKSBjb25z
dCB7IHJldHVybiBtX2RhdGFbM107IH0KLSAgICAgICAgR2x5cGhEYXRhIGxlZnQoKSBjb25zdCB7
IHJldHVybiBtX2RhdGFbMl07IH0KLSAgICAgICAgR2x5cGhEYXRhIHJpZ2h0KCkgY29uc3QgeyBy
ZXR1cm4gbV9kYXRhWzBdOyB9Ci0KLSAgICAgICAgdm9pZCBzZXROb3JtYWxNb2RlKCkKLSAgICAg
ICAgewotICAgICAgICAgICAgbV9tb2RlID0gRHJhd05vcm1hbDsKLSAgICAgICAgfQotICAgICAg
ICB2b2lkIHNldFNpemVWYXJpYW50TW9kZShjb25zdCBHbHlwaERhdGEmIHZhcmlhbnQpCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIG1fbW9kZSA9IERyYXdTaXplVmFyaWFudDsKLSAgICAgICAgICAg
IG1fZGF0YVswXSA9IHZhcmlhbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRHbHlwaEFz
c2VtYmx5TW9kZShjb25zdCBHbHlwaERhdGEmIHRvcCwgY29uc3QgR2x5cGhEYXRhJiBleHRlbnNp
b24sIGNvbnN0IEdseXBoRGF0YSYgYm90dG9tLCBjb25zdCBHbHlwaERhdGEmIG1pZGRsZSkKLSAg
ICAgICAgewotICAgICAgICAgICAgbV9tb2RlID0gRHJhd0dseXBoQXNzZW1ibHk7Ci0gICAgICAg
ICAgICBtX2RhdGFbMF0gPSB0b3A7Ci0gICAgICAgICAgICBtX2RhdGFbMV0gPSBleHRlbnNpb247
Ci0gICAgICAgICAgICBtX2RhdGFbMl0gPSBib3R0b207Ci0gICAgICAgICAgICBtX2RhdGFbM10g
PSBtaWRkbGU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyZXRjaHlEYXRhKCkKLSAgICAgICAgICAg
IDogbV9tb2RlKERyYXdOb3JtYWwpIHsgfQotICAgICAgICBTdHJldGNoeURhdGEoY29uc3QgU3Ry
ZXRjaHlEYXRhJiBkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEubV9t
b2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERyYXdOb3JtYWw6Ci0gICAgICAgICAgICAgICAgc2V0
Tm9ybWFsTW9kZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBE
cmF3U2l6ZVZhcmlhbnQ6Ci0gICAgICAgICAgICAgICAgc2V0U2l6ZVZhcmlhbnRNb2RlKGRhdGEu
dmFyaWFudCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRHJh
d0dseXBoQXNzZW1ibHk6Ci0gICAgICAgICAgICAgICAgc2V0R2x5cGhBc3NlbWJseU1vZGUoZGF0
YS50b3AoKSwgZGF0YS5leHRlbnNpb24oKSwgZGF0YS5ib3R0b20oKSwgZGF0YS5taWRkbGUoKSk7
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
IHByaXZhdGU6Ci0gICAgICAgIERyYXdNb2RlIG1fbW9kZTsKLSAgICAgICAgLy8gRklYTUU6IEZv
ciBPcGVuVHlwZSBmb250cyB3aXRoIGEgTUFUSCB0YWJsZSBhbGwgdGhlIGdseXBocyBhcmUgZnJv
bSB0aGUgc2FtZSBmb250LCBzbyB3ZSB3b3VsZCBvbmx5IG5lZWQgdG8gc3RvcmUgdGhlIGdseXBo
IGluZGljZXMgaGVyZS4KLSAgICAgICAgR2x5cGhEYXRhIG1fZGF0YVs0XTsKKyAgICBlbnVtIFN0
cmV0Y2hUeXBlIHsKKyAgICAgICAgVW5zdHJldGNoZWQsCisgICAgICAgIFNpemVWYXJpYW50LAor
ICAgICAgICBHbHlwaEFzc2VtYmx5CisgICAgfTsKKyAgICBTdHJldGNoVHlwZSBtX3N0cmV0Y2hU
eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgR2x5cGhEYXRhIG1fdmFyaWFudDsKKyAgICAgICAg
R2x5cGhBc3NlbWJseURhdGEgbV9hc3NlbWJseTsKICAgICB9OworICAgIExheW91dFVuaXQgbV9p
dGFsaWNDb3JyZWN0aW9uOwogCiAgICAgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IG92
ZXJyaWRlIHsgcmV0dXJuIGlzQW5vbnltb3VzKCkgPyAiUmVuZGVyTWF0aE1MT3BlcmF0b3IgKGFu
b255bW91cykiIDogIlJlbmRlck1hdGhNTE9wZXJhdG9yIjsgfQogICAgIHZvaWQgcGFpbnRDaGls
ZHJlbihQYWludEluZm8mIGZvclNlbGYsIGNvbnN0IExheW91dFBvaW50JiwgUGFpbnRJbmZvJiBm
b3JDaGlsZCwgYm9vbCB1c2VQcmludFJlY3QpIGZpbmFsOwpAQCAtMTQxLDkgKzExMiwxMiBAQCBw
cml2YXRlOgogCiAgICAgYm9vbCBzaG91bGRBbGxvd1N0cmV0Y2hpbmcoKSBjb25zdDsKIAotICAg
IGJvb2wgZ2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpB
c3NlbWJseVBhcnQ+LCBTdHJldGNoeURhdGEmKSBjb25zdDsKLSAgICBTdHJldGNoeURhdGEgZ2V0
RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcihVQ2hhcikgY29uc3Q7Ci0gICAgU3RyZXRjaHlEYXRh
IGZpbmRTdHJldGNoeURhdGEoVUNoYXIsIGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0aCk7CisgICAg
Ym9vbCBnZXRCYXNlR2x5cGgoY29uc3QgUmVuZGVyU3R5bGUmLCBHbHlwaERhdGEmKSBjb25zdDsK
KyAgICB2b2lkIHNldFNpemVWYXJpYW50KGNvbnN0IEdseXBoRGF0YSYpOworICAgIHZvaWQgc2V0
R2x5cGhBc3NlbWJseShjb25zdCBHbHlwaEFzc2VtYmx5RGF0YSYpOworICAgIGJvb2wgZ2V0R2x5
cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+
LCBHbHlwaEFzc2VtYmx5RGF0YSYpIGNvbnN0OworICAgIHZvaWQgZmluZERpc3BsYXlTdHlsZUxh
cmdlT3BlcmF0b3IoKTsKKyAgICB2b2lkIGZpbmRTdHJldGNoeURhdGEoZmxvYXQqIG1heGltdW1H
bHlwaFdpZHRoLCBMYXlvdXRVbml0IHRhcmdldFNpemUgPSAwKTsKIAogICAgIGVudW0gR2x5cGhQ
YWludFRyaW1taW5nIHsKICAgICAgICAgVHJpbVRvcCwKQEAgLTE3NSw3ICsxNDksNiBAQCBwcml2
YXRlOgogICAgIExheW91dFVuaXQgbV90cmFpbGluZ1NwYWNlOwogICAgIExheW91dFVuaXQgbV9t
aW5TaXplOwogICAgIExheW91dFVuaXQgbV9tYXhTaXplOwotICAgIFN0cmV0Y2h5RGF0YSBtX3N0
cmV0Y2h5RGF0YTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>277067</attachid>
            <date>2016-04-22 09:36:45 -0700</date>
            <delta_ts>2016-04-25 00:49:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>operator.patch</filename>
            <type>text/plain</type>
            <size>41733</size>
            <attacher name="Frédéric Wang Nélar">fred.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBiOGU5Y2ZhLi4xMDRlMzhkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTgg
QEAKKzIwMTYtMDQtMjIgIEZyZWRlcmljIFdhbmcgIDxmd2FuZ0BpZ2FsaWEuY29tPgorCisgICAg
ICAgIFJlbmRlck1hdGhNTE9wZXJhdG9yOiByZWZhY3RvciBtYW5hZ2VtZW50IG9mIHN0cmV0Y2h5
IGRhdGEgYW5kIGl0YWxpYyBjb3JyZWN0aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY5MTMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlaGF2aW9yIGlzIG5vdCBjaGFuZ2Vk
LgorCisgICAgICAgIFdlIHVzZSB1bmlvbiB0byBzaW1wbGlmeSB0aGUgc3RydWN0dXJlIHVzZWQg
dG8gbWFuYWdlIHRoZSBnbHlwaCBhc3NlbWJseSBhbmQgdGhlIHR5cGUgb2Ygc3RyZXRjaGluZy4K
KyAgICAgICAgV2UgYWxzbyBtb2RpZnkgdGhlIHNpZ25hdHVyZSBvZiBzb21lIGZ1bmN0aW9ucyB0
byByZXRyaWV2ZSBkaXNwbGF5IG9wZXJhdG9yIGFuZCBzdHJldGNoeSBkYXRhLgorICAgICAgICBG
aW5hbGx5LCB3ZSBpbnRyb2R1Y2Ugc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGVhc2lseSBzZXQg
dGhlIHN0cmV0Y2h5IGRhdGEuCisKKyAgICAgICAgKiByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1h
dGhNTE9wZXJhdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9y
Ojpjb21wdXRlUHJlZmVycmVkTG9naWNhbFdpZHRocyk6IFVzZSB0aGUgbmV3IGRhdGEgbWVtYmVy
cyBhbmQgZnVuY3Rpb24gc2lnbmF0dXJlcy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjpzZXRTaXplVmFyaWFudCk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGEg
c2l6ZSB2YXJpYW50LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnNl
dEdseXBoQXNzZW1ibHkpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIGdseXBoIGFzc2Vt
Ymx5LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNz
ZW1ibHlGYWxsQmFjayk6IFdlIGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIHVzZSBhIEdseXBoQXNz
ZW1ibHlEYXRhLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRE
aXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKTogV2UgcmVuYW1lIHRoZSBmdW5jdGlvbiBhbmQKKyAg
ICAgICAgY2hhbmdlIGl0cyBzaWduYXR1cmUgdG8gcmVtb3ZlIHRoZSByZXR1cm4gdmFsdWUuCisg
ICAgICAgIFdlIG5vdyBhbHNvIHNldCB0aGUgaXRhbGljIGNvcnJlY3Rpb24gd2hlbiBhIGRpc3Bs
YXkgb3BlcmF0b3IgaXMgZm91bmQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVy
YXRvcjo6ZmluZFN0cmV0Y2h5RGF0YSk6IFdlIGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIGludHJv
ZHVjZSBhCisgICAgICAgIHRhcmdldCBzaXplIGFuZCByZW1vdmUgdGhlIHJldHVybiB2YWx1ZS4K
KyAgICAgICAgV2UgYWxzbyByZW1vdmUgdGhlIGNoYXJhY3RlciBwYXJhbWV0ZXIgd2hpY2ggaXMg
YWx3YXlzIG1fdGV4dENvbnRlbnQuCisgICAgICAgIFRoaXMgYWxzbyBkb2VzIHRoZSBlYXJseSBy
ZXR1cm4gd2hlbiB0aGUgYmFzZSBnbHlwaCBpcyBsYXJnZSBlbm91Z2guCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUpOiBXZSB1c2UgdGhlIG5ldyBk
YXRhIG1lbWJlcnMgYW5kIGZ1bmN0aW9uIHNpZ25hdHVyZXMuCisgICAgICAgIFRoZSBjaGVjayBm
b3IgdGhlIGJhc2UgZ2x5cGggc2l6ZSBpcyBub3cgZG9uZSBpbiBmaW5kU3RyZXRjaHlEYXRhLCBz
byB3ZSBqdXN0IGNoZWNrIHdoZXRoZXIKKyAgICAgICAgbV9zdHJldGNoVHlwZSBpcyBVbnN0cmV0
Y2hlZCB0byBkbyBhbiBlYXJseSByZXR1cm4uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6Zmlyc3RMaW5lQmFzZWxpbmUpOiBXZSB1c2UgbV9zdHJldGNoVHlwZS4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpjb21wdXRlTG9naWNhbEhlaWdo
dCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxX
aXRoVmVydGljYWxFeHRlbnNpb25HbHlwaCk6IFVzZSB0aGUgbmV3IGNsYXNzIG1lbWJlcnMuCisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhIb3Jpem9udGFs
RXh0ZW5zaW9uR2x5cGgpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpwYWludCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFzc2VtYmx5KTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jpem9udGFsR2x5cGhBc3NlbWJseSk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50Q2hp
bGRyZW4pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjp0
cmFpbGluZ1NwYWNlRXJyb3IpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjppdGFsaWNDb3JyZWN0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKTogRGVs
ZXRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmg6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXRhbGljQ29ycmVjdGlv
bik6IFdlIGp1c3QgcmV0dXJuIG1faXRhbGljQ29ycmVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpHbHlwaEFzc2VtYmx5RGF0YTo6R2x5cGhBc3NlbWJseURh
dGEpOiBOZXcgY2xhc3MgdG8gc3RvcmUgYW4gYXNzZW1ibHkgb2YgR2x5cGhEYXRhLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6bW9kZSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlE
YXRhOjp2YXJpYW50KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpTdHJldGNoeURhdGE6OnRvcCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpleHRlbnNpb24pOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6Ym90
dG9tKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpT
dHJldGNoeURhdGE6Om1pZGRsZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJN
YXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpsZWZ0KTogRGVsZXRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnJpZ2h0KTogRGVsZXRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6
OnNldE5vcm1hbE1vZGUpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1M
T3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6c2V0U2l6ZVZhcmlhbnRNb2RlKTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnNldEds
eXBoQXNzZW1ibHlNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OlN0cmV0Y2h5RGF0YSk6IERlbGV0ZWQuCisKIDIwMTYt
MDQtMjIgIEZyZWRlcmljIFdhbmcgIDxmcmVkLndhbmdAZnJlZS5mcj4KIAogICAgICAgICBSZW5k
ZXJNYXRoTUxPcGVyYXRvciByZWZhY3RvcmluZzogaW50cm9kdWNlIGdldEJhc2VHbHlwaCBhbmQg
cmVtb3ZlIHBhcmFtZXRlciBmcm9tIGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0
b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVy
YXRvci5jcHAKaW5kZXggZTllOTZlNi4uNzkwOTAyZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHAKQEAgLTIw
MiwxOCArMjAyLDYgQEAgYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXNDaGlsZEFsbG93ZWQo
Y29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUmVuZGVyU3R5bGUKICAgICByZXR1cm4gZmFsc2U7
CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6Oml0YWxpY0NvcnJlY3Rpb24o
KSBjb25zdAotewotICAgIGlmIChpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKSB7Ci0g
ICAgICAgIGNvbnN0IGF1dG8mIHByaW1hcnlGb250ID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLnBy
aW1hcnlGb250KCk7Ci0gICAgICAgIGlmIChhdXRvKiBtYXRoRGF0YSA9IHByaW1hcnlGb250Lm1h
dGhEYXRhKCkpIHsKLSAgICAgICAgICAgIFN0cmV0Y2h5RGF0YSBsYXJnZU9wZXJhdG9yID0gZ2V0
RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOwotICAgICAgICAgICAgcmV0dXJuIG1hdGhEYXRh
LT5nZXRJdGFsaWNDb3JyZWN0aW9uKHByaW1hcnlGb250LCBsYXJnZU9wZXJhdG9yLnZhcmlhbnQo
KS5nbHlwaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHZvaWQgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OnN0cmV0Y2hUbyhMYXlvdXRVbml0IGhlaWdodEFib3ZlQmFzZWxp
bmUsIExheW91dFVuaXQgZGVwdGhCZWxvd0Jhc2VsaW5lKQogewogICAgIEFTU0VSVChoYXNPcGVy
YXRvckZsYWcoTWF0aE1MT3BlcmF0b3JEaWN0aW9uYXJ5OjpTdHJldGNoeSkpOwpAQCAtMzE3LDEy
ICszMDUsMTIgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZVByZWZlcnJlZExv
Z2ljYWxXaWR0aHMoKQogICAgIH0KICAgICBpZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5
bGUoKSkgewogICAgICAgICAvLyBMYXJnZSBvcGVyYXRvcnMgaW4gU1RJWCBXb3JkIGhhdmUgaW5j
b3JyZWN0IGFkdmFuY2Ugd2lkdGgsIGNhdXNpbmcgbWlzcGxhY2VtZW50IG9mIHN1cGVyc2NyaXB0
LCBzbyB3ZSB1c2UgdGhlIGdseXBoIGJvdW5kIGluc3RlYWQgKGh0dHA6Ly9zb3VyY2Vmb3JnZS5u
ZXQvcC9zdGl4Zm9udHMvdHJhY2tpbmcvNDkvKS4KLSAgICAgICAgU3RyZXRjaHlEYXRhIGxhcmdl
T3BlcmF0b3IgPSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7Ci0gICAgICAgIGlmIChs
YXJnZU9wZXJhdG9yLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpCi0gICAgICAgICAgICBtYXhp
bXVtR2x5cGhXaWR0aCA9IGJvdW5kc0ZvckdseXBoKGxhcmdlT3BlcmF0b3IudmFyaWFudCgpKS53
aWR0aCgpOworICAgICAgICBmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOworICAgICAg
ICBpZiAobV9zdHJldGNoVHlwZSA9PSBTaXplVmFyaWFudCkKKyAgICAgICAgICAgIG1heGltdW1H
bHlwaFdpZHRoID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KS53aWR0aCgpOwogICAgIH0gZWxz
ZSB7CiAgICAgICAgIC8vIEZJWE1FOiBzb21lIGdseXBocyAoZS5nLiB0aGUgb25lIGZvciAiRlJB
Q1RJT04gU0xBU0giIGluIHRoZSBTVElYIE1hdGggZm9udCBvciBsYXJnZSBvcGVyYXRvcnMpIGhh
dmUgYSB3aWR0aCB0aGF0IGRlcGVuZHMgb24gdGhlIGhlaWdodCwgcmVzdWx0aW5nIGluIGxhcmdl
IGdhcHMgKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzAzMjYpLgot
ICAgICAgICBmaW5kU3RyZXRjaHlEYXRhKG1fdGV4dENvbnRlbnQsICZtYXhpbXVtR2x5cGhXaWR0
aCk7CisgICAgICAgIGZpbmRTdHJldGNoeURhdGEoJm1heGltdW1HbHlwaFdpZHRoKTsKICAgICB9
CiAgICAgbV9tYXhQcmVmZXJyZWRMb2dpY2FsV2lkdGggPSBtX21pblByZWZlcnJlZExvZ2ljYWxX
aWR0aCA9IG1fbGVhZGluZ1NwYWNlICsgbWF4aW11bUdseXBoV2lkdGggKyBtX3RyYWlsaW5nU3Bh
Y2U7CiB9CkBAIC0zOTIsMTMgKzM4MCwyMSBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpn
ZXRCYXNlR2x5cGgoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBHbHlwaERhdGEmIGJhcwogICAg
IHJldHVybiBiYXNlR2x5cGguaXNWYWxpZCgpICYmIGJhc2VHbHlwaC5mb250ID09ICZzdHlsZS5m
b250Q2FzY2FkZSgpLnByaW1hcnlGb250KCk7CiB9CiAKLWJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNz
ZW1ibHlQYXJ0PiBhc3NlbWJseVBhcnRzLCBTdHJldGNoeURhdGEmIHN0cmV0Y2h5RGF0YSkgY29u
c3QKK3ZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnNldFNpemVWYXJpYW50KGNvbnN0IEdseXBo
RGF0YSYgc2l6ZVZhcmlhbnQpCiB7Ci0gICAgR2x5cGhEYXRhIHRvcDsKLSAgICBHbHlwaERhdGEg
ZXh0ZW5zaW9uOwotICAgIEdseXBoRGF0YSBib3R0b207Ci0gICAgR2x5cGhEYXRhIG1pZGRsZTsK
KyAgICBBU1NFUlQoc2l6ZVZhcmlhbnQuaXNWYWxpZCgpICYmIHNpemVWYXJpYW50LmZvbnQtPm1h
dGhEYXRhKCkpOworICAgIG1fc3RyZXRjaFR5cGUgPSBTaXplVmFyaWFudDsKKyAgICBtX3Zhcmlh
bnQgPSBzaXplVmFyaWFudDsKK30KIAordm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c2V0R2x5
cGhBc3NlbWJseShjb25zdCBHbHlwaEFzc2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKQoreworICAg
IG1fc3RyZXRjaFR5cGUgPSBHbHlwaEFzc2VtYmx5OworICAgIG1fYXNzZW1ibHkgPSBhc3NlbWJs
eURhdGE7Cit9CisKK2Jvb2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlG
YWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0PiBhc3NlbWJseVBh
cnRzLCBHbHlwaEFzc2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKSBjb25zdAorewogICAgIC8vIFRo
ZSBzdHJ1Y3R1cmUgb2YgdGhlIE9wZW4gVHlwZSBNYXRoIHRhYmxlIGlzIGEgYml0IG1vcmUgZ2Vu
ZXJhbCB0aGFuIHRoZSBvbmUgY3VycmVudGx5IHVzZWQgYnkgdGhlIFJlbmRlck1hdGhNTE9wZXJh
dG9yIGNvZGUsIHNvIHdlIHRyeSB0byBmYWxsYmFjayBpbiBhIHJlYXNvbmFibGUgd2F5LgogICAg
IC8vIEZJWE1FOiBSZW5kZXJNYXRoTUxPcGVyYXRvciBzaG91bGQgc3VwcG9ydCB0aGUgbW9zdCBn
ZW5lcmFsIGZvcm1hdCAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEz
MDMyNykuCiAgICAgLy8gV2UgdXNlIHRoZSBhcHByb2FjaCBvZiB0aGUgY29weUNvbXBvbmVudHMg
ZnVuY3Rpb24gaW4gZ2l0aHViLmNvbS9tYXRoamF4L01hdGhKYXgtZGV2L2Jsb2IvbWFzdGVyL2Zv
bnRzL09wZW5UeXBlTWF0aC9mb250VXRpbC5weQpAQCAtNDIyLDggKzQxOCw4IEBAIGJvb2wgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5
cGVNYXRoRGF0YTo6QXNzCiAgICAgICAgIE5vbmUKICAgICB9OwogICAgIFBhcnRUeXBlIGV4cGVj
dGVkID0gU3RhcnQ7Ci0gICAgZXh0ZW5zaW9uLmdseXBoID0gMDsKLSAgICBtaWRkbGUuZ2x5cGgg
PSAwOworICAgIGFzc2VtYmx5RGF0YS5leHRlbnNpb24uZ2x5cGggPSAwOworICAgIGFzc2VtYmx5
RGF0YS5taWRkbGUuZ2x5cGggPSAwOwogICAgIGZvciAoYXV0byYgcGFydCA6IGFzc2VtYmx5UGFy
dHMpIHsKICAgICAgICAgaWYgKG5vbkV4dGVuZGVyQ291bnQgPCAzKSB7CiAgICAgICAgICAgICAv
LyBJZiB3ZSBvbmx5IGhhdmUgYXQgbW9zdCB0d28gbm9uLWV4dGVuZGVycyB0aGVuIHdlIHNraXAg
dGhlIG1pZGRsZSBnbHlwaC4KQEAgLTQzMyw5ICs0MjksOSBAQCBib29sIFJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6
OkFzcwogICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gRW5kOwogICAgICAgICB9CiAgICAgICAg
IGlmIChwYXJ0LmlzRXh0ZW5kZXIpIHsKLSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmdseXBo
KQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nbHlwaCA9IHBhcnQuZ2x5cGg7IC8vIFdlIGNv
cHkgdGhlIGV4dGVuZGVyIHBhcnQuCi0gICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24uZ2x5
cGggIT0gcGFydC5nbHlwaCkKKyAgICAgICAgICAgIGlmICghYXNzZW1ibHlEYXRhLmV4dGVuc2lv
bi5nbHlwaCkKKyAgICAgICAgICAgICAgICBhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoID0g
cGFydC5nbHlwaDsgLy8gV2UgY29weSB0aGUgZXh0ZW5kZXIgcGFydC4KKyAgICAgICAgICAgIGVs
c2UgaWYgKGFzc2VtYmx5RGF0YS5leHRlbnNpb24uZ2x5cGggIT0gcGFydC5nbHlwaCkKICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgaXMgbm90IHN1cHBvcnRlZDogdGhlIGFz
c2VtYmx5IGhhcyBkaWZmZXJlbnQgZXh0ZW5kZXJzLgogCiAgICAgICAgICAgICBzd2l0Y2ggKGV4
cGVjdGVkKSB7CkBAIC00NjEsMTkgKzQ1NywxOSBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9y
OjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzcwog
ICAgICAgICBzd2l0Y2ggKGV4cGVjdGVkKSB7CiAgICAgICAgIGNhc2UgU3RhcnQ6CiAgICAgICAg
ICAgICAvLyBXZSBjb3B5IHRoZSBsZWZ0L2JvdHRvbSBwYXJ0LgotICAgICAgICAgICAgYm90dG9t
LmdseXBoID0gcGFydC5nbHlwaDsKKyAgICAgICAgICAgIGFzc2VtYmx5RGF0YS5ib3R0b20uZ2x5
cGggPSBwYXJ0LmdseXBoOwogICAgICAgICAgICAgZXhwZWN0ZWQgPSBFeHRlbmRlckJldHdlZW5T
dGFydEFuZE1pZGRsZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIEV4dGVu
ZGVyQmV0d2VlblN0YXJ0QW5kTWlkZGxlOgogICAgICAgICBjYXNlIE1pZGRsZToKICAgICAgICAg
ICAgIC8vIFdlIGNvcHkgdGhlIG1pZGRsZSBwYXJ0LgotICAgICAgICAgICAgbWlkZGxlLmdseXBo
ID0gcGFydC5nbHlwaDsKKyAgICAgICAgICAgIGFzc2VtYmx5RGF0YS5taWRkbGUuZ2x5cGggPSBw
YXJ0LmdseXBoOwogICAgICAgICAgICAgZXhwZWN0ZWQgPSBFeHRlbmRlckJldHdlZW5NaWRkbGVB
bmRFbmQ7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgY2FzZSBFeHRlbmRlckJldHdl
ZW5NaWRkbGVBbmRFbmQ6CiAgICAgICAgIGNhc2UgRW5kOgogICAgICAgICAgICAgLy8gV2UgY29w
eSB0aGUgcmlnaHQvdG9wIHBhcnQuCi0gICAgICAgICAgICB0b3AuZ2x5cGggPSBwYXJ0LmdseXBo
OworICAgICAgICAgICAgYXNzZW1ibHlEYXRhLnRvcC5nbHlwaCA9IHBhcnQuZ2x5cGg7CiAgICAg
ICAgICAgICBleHBlY3RlZCA9IE5vbmU7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg
Y2FzZSBOb25lOgpAQCAtNDgyLDM1ICs0NzgsMzAgQEAgYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6Z2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3MK
ICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghZXh0ZW5zaW9uLmdseXBoKQorICAgIGlmICgh
YXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaCkKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBU
aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IHdlIGFsd2F5cyBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIGV4
dGVuc2lvbiBnbHlwaC4KIAogICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG9wL2JvdHRvbSBnbHlw
aHMsIHdlIHVzZSB0aGUgZXh0ZW5zaW9uIGdseXBoLgotICAgIGlmICghdG9wLmdseXBoKQotICAg
ICAgICB0b3AuZ2x5cGggPSBleHRlbnNpb24uZ2x5cGg7Ci0gICAgaWYgKCFib3R0b20uZ2x5cGgp
Ci0gICAgICAgIGJvdHRvbS5nbHlwaCA9IGV4dGVuc2lvbi5nbHlwaDsKKyAgICBpZiAoIWFzc2Vt
Ymx5RGF0YS50b3AuZ2x5cGgpCisgICAgICAgIGFzc2VtYmx5RGF0YS50b3AuZ2x5cGggPSBhc3Nl
bWJseURhdGEuZXh0ZW5zaW9uLmdseXBoOworICAgIGlmICghYXNzZW1ibHlEYXRhLmJvdHRvbS5n
bHlwaCkKKyAgICAgICAgYXNzZW1ibHlEYXRhLmJvdHRvbS5nbHlwaCA9IGFzc2VtYmx5RGF0YS5l
eHRlbnNpb24uZ2x5cGg7CiAKLSAgICB0b3AuZm9udCA9ICZzdHlsZSgpLmZvbnRDYXNjYWRlKCku
cHJpbWFyeUZvbnQoKTsKLSAgICBleHRlbnNpb24uZm9udCA9IHRvcC5mb250OwotICAgIGJvdHRv
bS5mb250ID0gdG9wLmZvbnQ7Ci0gICAgaWYgKG1pZGRsZS5nbHlwaCkKLSAgICAgICAgbWlkZGxl
LmZvbnQgPSB0b3AuZm9udDsKLQotICAgIHN0cmV0Y2h5RGF0YS5zZXRHbHlwaEFzc2VtYmx5TW9k
ZSh0b3AsIGV4dGVuc2lvbiwgYm90dG9tLCBtaWRkbGUpOworICAgIGFzc2VtYmx5RGF0YS50b3Au
Zm9udCA9ICZzdHlsZSgpLmZvbnRDYXNjYWRlKCkucHJpbWFyeUZvbnQoKTsKKyAgICBhc3NlbWJs
eURhdGEuZXh0ZW5zaW9uLmZvbnQgPSBhc3NlbWJseURhdGEudG9wLmZvbnQ7CisgICAgYXNzZW1i
bHlEYXRhLmJvdHRvbS5mb250ID0gYXNzZW1ibHlEYXRhLnRvcC5mb250OworICAgIGFzc2VtYmx5
RGF0YS5taWRkbGUuZm9udCA9IGFzc2VtYmx5RGF0YS5taWRkbGUuZ2x5cGggPyBhc3NlbWJseURh
dGEudG9wLmZvbnQgOiBudWxscHRyOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLVJlbmRlck1h
dGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldERpc3Bs
YXlTdHlsZUxhcmdlT3BlcmF0b3IoKSBjb25zdAordm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
ZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKQogewotICAgIFN0cmV0Y2h5RGF0YSBkYXRh
OwotCiAgICAgQVNTRVJUKG1faXNWZXJ0aWNhbCAmJiBpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlT
dHlsZSgpKTsKIAogICAgIEdseXBoRGF0YSBiYXNlR2x5cGg7CiAgICAgaWYgKCFnZXRCYXNlR2x5
cGgoc3R5bGUoKSwgYmFzZUdseXBoKSB8fCAhYmFzZUdseXBoLmZvbnQtPm1hdGhEYXRhKCkpCi0g
ICAgICAgIHJldHVybiBkYXRhOworICAgICAgICByZXR1cm47CiAKICAgICBWZWN0b3I8R2x5cGg+
IHNpemVWYXJpYW50czsKICAgICBWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0
PiBhc3NlbWJseVBhcnRzOwpAQCAtNTIxLDU5ICs1MTIsNjAgQEAgUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OlN0cmV0Y2h5RGF0YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0RGlzcGxheVN0eWxlTGFy
Z2VPcGUKICAgICBiYXNlR2x5cGguZm9udC0+bWF0aERhdGEoKS0+Z2V0TWF0aFZhcmlhbnRzKGJh
c2VHbHlwaC5nbHlwaCwgdHJ1ZSwgc2l6ZVZhcmlhbnRzLCBhc3NlbWJseVBhcnRzKTsKIAogICAg
IC8vIFdlIGNob29zZSB0aGUgZmlyc3Qgc2l6ZSB2YXJpYW50IHRoYXQgaXMgbGFyZ2VyIHRoYW4g
dGhlIGV4cGVjdGVkIGRpc3BsYXlPcGVyYXRvck1pbkhlaWdodCBhbmQgb3RoZXJ3aXNlIGZhbGxi
YWNrIHRvIHRoZSBsYXJnZXN0IHZhcmlhbnQuCi0gICAgZm9yIChhdXRvJiB2YXJpYW50IDogc2l6
ZVZhcmlhbnRzKSB7Ci0gICAgICAgIEdseXBoRGF0YSBzaXplVmFyaWFudDsKLSAgICAgICAgc2l6
ZVZhcmlhbnQuZ2x5cGggPSB2YXJpYW50OwotICAgICAgICBzaXplVmFyaWFudC5mb250ID0gYmFz
ZUdseXBoLmZvbnQ7Ci0gICAgICAgIGRhdGEuc2V0U2l6ZVZhcmlhbnRNb2RlKHNpemVWYXJpYW50
KTsKLSAgICAgICAgaWYgKGJvdW5kc0ZvckdseXBoKHNpemVWYXJpYW50KS5oZWlnaHQoKSA+PSBk
aXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQpCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICBm
b3IgKGF1dG8mIHNpemVWYXJpYW50IDogc2l6ZVZhcmlhbnRzKSB7CisgICAgICAgIEdseXBoRGF0
YSBnbHlwaERhdGEoc2l6ZVZhcmlhbnQsIGJhc2VHbHlwaC5mb250KTsKKyAgICAgICAgc2V0U2l6
ZVZhcmlhbnQoZ2x5cGhEYXRhKTsKKyAgICAgICAgbV9pdGFsaWNDb3JyZWN0aW9uID0gZ2x5cGhE
YXRhLmZvbnQtPm1hdGhEYXRhKCktPmdldEl0YWxpY0NvcnJlY3Rpb24oKmdseXBoRGF0YS5mb250
LCBnbHlwaERhdGEuZ2x5cGgpOworICAgICAgICBpZiAoaGVpZ2h0Rm9yR2x5cGgoZ2x5cGhEYXRh
KSA+PSBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQpCisgICAgICAgICAgICBicmVhazsKICAgICB9
Ci0gICAgcmV0dXJuIGRhdGE7CiB9CiAKLVJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURh
dGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRTdHJldGNoeURhdGEoVUNoYXIgY2hhcmFjdGVy
LCBmbG9hdCogbWF4aW11bUdseXBoV2lkdGgpCit2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpm
aW5kU3RyZXRjaHlEYXRhKGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0aCwgTGF5b3V0VW5pdCB0YXJn
ZXRTaXplKQogewogICAgIEFTU0VSVCghbWF4aW11bUdseXBoV2lkdGggfHwgbV9pc1ZlcnRpY2Fs
KTsKIAotICAgIFN0cmV0Y2h5RGF0YSBkYXRhOwotICAgIFN0cmV0Y2h5RGF0YSBhc3NlbWJseURh
dGE7Ci0KICAgICBHbHlwaERhdGEgYmFzZUdseXBoOwogICAgIGlmICghZ2V0QmFzZUdseXBoKHN0
eWxlKCksIGJhc2VHbHlwaCkpCi0gICAgICAgIHJldHVybiBkYXRhOworICAgICAgICByZXR1cm47
CiAgICAgCisgICAgaWYgKCFtYXhpbXVtR2x5cGhXaWR0aCkgeworICAgICAgICAvLyBXZSBkbyBu
b3Qgc3RyZXRjaCBpZiB0aGUgYmFzZSBnbHlwaCBpcyBsYXJnZSBlbm91Z2guCisgICAgICAgIGZs
b2F0IGJhc2VTaXplID0gbV9pc1ZlcnRpY2FsID8gaGVpZ2h0Rm9yR2x5cGgoYmFzZUdseXBoKSA6
IGFkdmFuY2VXaWR0aEZvckdseXBoKGJhc2VHbHlwaCk7CisgICAgICAgIGlmICh0YXJnZXRTaXpl
IDw9IGJhc2VTaXplKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdseXBoQXNz
ZW1ibHlEYXRhIGFzc2VtYmx5RGF0YTsKICAgICBpZiAoYmFzZUdseXBoLmZvbnQtPm1hdGhEYXRh
KCkpIHsKICAgICAgICAgVmVjdG9yPEdseXBoPiBzaXplVmFyaWFudHM7CiAgICAgICAgIFZlY3Rv
cjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+IGFzc2VtYmx5UGFydHM7CiAgICAgICAg
IGJhc2VHbHlwaC5mb250LT5tYXRoRGF0YSgpLT5nZXRNYXRoVmFyaWFudHMoYmFzZUdseXBoLmds
eXBoLCBtX2lzVmVydGljYWwsIHNpemVWYXJpYW50cywgYXNzZW1ibHlQYXJ0cyk7CiAgICAgICAg
IC8vIFdlIHZlcmlmeSB0aGUgc2l6ZSB2YXJpYW50cy4KLSAgICAgICAgZm9yIChhdXRvJiB2YXJp
YW50IDogc2l6ZVZhcmlhbnRzKSB7Ci0gICAgICAgICAgICBHbHlwaERhdGEgc2l6ZVZhcmlhbnQ7
Ci0gICAgICAgICAgICBzaXplVmFyaWFudC5nbHlwaCA9IHZhcmlhbnQ7Ci0gICAgICAgICAgICBz
aXplVmFyaWFudC5mb250ID0gYmFzZUdseXBoLmZvbnQ7CisgICAgICAgIGZvciAoYXV0byYgc2l6
ZVZhcmlhbnQgOiBzaXplVmFyaWFudHMpIHsKKyAgICAgICAgICAgIEdseXBoRGF0YSBnbHlwaERh
dGEoc2l6ZVZhcmlhbnQsIGJhc2VHbHlwaC5mb250KTsKICAgICAgICAgICAgIGlmIChtYXhpbXVt
R2x5cGhXaWR0aCkKLSAgICAgICAgICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1h
eCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKHNpemVWYXJpYW50KSk7
CisgICAgICAgICAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1H
bHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChnbHlwaERhdGEpKTsKICAgICAgICAgICAg
IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEuc2V0U2l6ZVZhcmlhbnRNb2RlKHNpemVWYXJp
YW50KTsKLSAgICAgICAgICAgICAgICBmbG9hdCBzaXplID0gbV9pc1ZlcnRpY2FsID8gaGVpZ2h0
Rm9yR2x5cGgoc2l6ZVZhcmlhbnQpIDogYWR2YW5jZVdpZHRoRm9yR2x5cGgoc2l6ZVZhcmlhbnQp
OworICAgICAgICAgICAgICAgIHNldFNpemVWYXJpYW50KGdseXBoRGF0YSk7CisgICAgICAgICAg
ICAgICAgZmxvYXQgc2l6ZSA9IG1faXNWZXJ0aWNhbCA/IGhlaWdodEZvckdseXBoKGdseXBoRGF0
YSkgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChnbHlwaERhdGEpOwogICAgICAgICAgICAgICAgIGlm
IChzaXplID49IHN0cmV0Y2hTaXplKCkpIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0
YTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9
CiAKICAgICAgICAgLy8gV2UgdmVyaWZ5IGlmIHRoZXJlIGlzIGEgY29uc3RydWN0aW9uLgogICAg
ICAgICBpZiAoIWdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhhc3NlbWJseVBhcnRzLCBhc3NlbWJs
eURhdGEpKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICByZXR1cm47CiAg
ICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFtX2lzVmVydGljYWwpCi0gICAgICAgICAgICByZXR1
cm4gZGF0YTsKKyAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICAvLyBJZiB0aGUgZm9udCBk
b2VzIG5vdCBoYXZlIGEgTUFUSCB0YWJsZSwgd2UgZmFsbGJhY2sgdG8gdGhlIFVuaWNvZGUtb25s
eSBjb25zdHJ1Y3Rpb25zLgogICAgICAgICBjb25zdCBTdHJldGNoeUNoYXJhY3Rlciogc3RyZXRj
aHlDaGFyYWN0ZXIgPSBudWxscHRyOwogICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXhJbmRleCA9
IFdURl9BUlJBWV9MRU5HVEgoc3RyZXRjaHlDaGFyYWN0ZXJzKTsKICAgICAgICAgZm9yICh1bnNp
Z25lZCBpbmRleCA9IDA7IGluZGV4IDwgbWF4SW5kZXg7ICsraW5kZXgpIHsKLSAgICAgICAgICAg
IGlmIChzdHJldGNoeUNoYXJhY3RlcnNbaW5kZXhdLmNoYXJhY3RlciA9PSBjaGFyYWN0ZXIpIHsK
KyAgICAgICAgICAgIGlmIChzdHJldGNoeUNoYXJhY3RlcnNbaW5kZXhdLmNoYXJhY3RlciA9PSBt
X3RleHRDb250ZW50KSB7CiAgICAgICAgICAgICAgICAgc3RyZXRjaHlDaGFyYWN0ZXIgPSAmc3Ry
ZXRjaHlDaGFyYWN0ZXJzW2luZGV4XTsKICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKCkuaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbigpICYmIGluZGV4IDwgbGVmdFJpZ2h0UGFpcnNDb3VudCAqIDIp
IHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluIHJpZ2h0LXRvLWxlZnQgZGly
ZWN0aW9uIHdlIHNlbGVjdCB0aGUgbWlycm9yZWQgZm9ybSBieSBhZGRpbmcgLTEgb3IgKzEgYWNj
b3JkaW5nIHRvIHRoZSBwYXJpdHkgb2YgaW5kZXguCkBAIC01ODUsNDUgKzU3NywzMiBAQCBSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaW5k
U3RyZXRjaHlEYXRhKFVDaGFyCiAKICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBzdHJl
dGNoeSBjaGFyYWN0ZXIgc2V0IGZvciB0aGlzIGNoYXJhY3Rlciwgd2UgZG9uJ3Qga25vdyBob3cg
dG8gc3RyZXRjaCBpdC4KICAgICAgICAgaWYgKCFzdHJldGNoeUNoYXJhY3RlcikKLSAgICAgICAg
ICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8vIFdlIGNv
bnZlcnQgdGhlIGxpc3Qgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIGludG8gYSBsaXN0IG9mIGdseXBo
IGRhdGEuCi0gICAgICAgIEdseXBoRGF0YSB0b3AgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5
cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT50b3BDaGFyLCBmYWxzZSk7Ci0g
ICAgICAgIEdseXBoRGF0YSBleHRlbnNpb24gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhE
YXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5leHRlbnNpb25DaGFyLCBmYWxzZSk7
Ci0gICAgICAgIEdseXBoRGF0YSBib3R0b20gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhE
YXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5ib3R0b21DaGFyLCBmYWxzZSk7Ci0g
ICAgICAgIEdseXBoRGF0YSBtaWRkbGU7Ci0gICAgICAgIGlmIChzdHJldGNoeUNoYXJhY3Rlci0+
bWlkZGxlQ2hhcikKLSAgICAgICAgICAgIG1pZGRsZSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPm1pZGRsZUNoYXIsIGZhbHNl
KTsKLSAgICAgICAgYXNzZW1ibHlEYXRhLnNldEdseXBoQXNzZW1ibHlNb2RlKHRvcCwgZXh0ZW5z
aW9uLCBib3R0b20sIG1pZGRsZSk7CisgICAgICAgIGFzc2VtYmx5RGF0YS50b3AgPSBzdHlsZSgp
LmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT50
b3BDaGFyLCBmYWxzZSk7CisgICAgICAgIGFzc2VtYmx5RGF0YS5leHRlbnNpb24gPSBzdHlsZSgp
LmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5l
eHRlbnNpb25DaGFyLCBmYWxzZSk7CisgICAgICAgIGFzc2VtYmx5RGF0YS5ib3R0b20gPSBzdHls
ZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVy
LT5ib3R0b21DaGFyLCBmYWxzZSk7CisgICAgICAgIGFzc2VtYmx5RGF0YS5taWRkbGUgPSBzdHJl
dGNoeUNoYXJhY3Rlci0+bWlkZGxlQ2hhciA/IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPm1pZGRsZUNoYXIsIGZhbHNlKSA6IEds
eXBoRGF0YSgpOwogICAgIH0KIAotICAgIEFTU0VSVChhc3NlbWJseURhdGEubW9kZSgpID09IERy
YXdHbHlwaEFzc2VtYmx5KTsKLQogICAgIC8vIElmIHdlIGFyZSBtZWFzdXJpbmcgdGhlIG1heGlt
dW0gd2lkdGgsIHZlcmlmeSBlYWNoIGNvbXBvbmVudC4KICAgICBpZiAobWF4aW11bUdseXBoV2lk
dGgpIHsKLSAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlw
aFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEudG9wKCkpKTsKLSAgICAg
ICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZh
bmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEuZXh0ZW5zaW9uKCkpKTsKLSAgICAgICAgaWYg
KGFzc2VtYmx5RGF0YS5taWRkbGUoKS5nbHlwaCkKLSAgICAgICAgICAgICptYXhpbXVtR2x5cGhX
aWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgo
YXNzZW1ibHlEYXRhLm1pZGRsZSgpKSk7Ci0gICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0
ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlE
YXRhLmJvdHRvbSgpKSk7Ci0gICAgICAgIHJldHVybiBhc3NlbWJseURhdGE7CisgICAgICAgICpt
YXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLnRvcCkpOworICAgICAgICAqbWF4aW11bUdseXBoV2lk
dGggPSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFz
c2VtYmx5RGF0YS5leHRlbnNpb24pKTsKKyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3Rk
OjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURh
dGEubWlkZGxlKSk7CisgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhp
bXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmJvdHRvbSkp
OworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy8gV2UgZW5zdXJlIHRoYXQgdGhlIHNp
emUgaXMgbGFyZ2UgZW5vdWdoIHRvIGF2b2lkIGdseXBoIG92ZXJsYXBzLgotICAgIGZsb2F0IHNp
emU7Ci0gICAgaWYgKG1faXNWZXJ0aWNhbCkgewotICAgICAgICBzaXplID0gaGVpZ2h0Rm9yR2x5
cGgoYXNzZW1ibHlEYXRhLnRvcCgpKSArIGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS5ib3R0
b20oKSk7Ci0gICAgICAgIGlmIChhc3NlbWJseURhdGEubWlkZGxlKCkuZ2x5cGgpCi0gICAgICAg
ICAgICBzaXplICs9IGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUoKSk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgc2l6ZSA9IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0
YS5sZWZ0KCkpICsgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLnJpZ2h0KCkpOwot
ICAgICAgICBpZiAoYXNzZW1ibHlEYXRhLm1pZGRsZSgpLmdseXBoKQotICAgICAgICAgICAgc2l6
ZSArPSBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKCkpOwotICAgIH0K
LSAgICBpZiAoc2l6ZSA+IHN0cmV0Y2hTaXplKCkpCi0gICAgICAgIHJldHVybiBkYXRhOworICAg
IGZsb2F0IG1pblNpemUgPSBtX2lzVmVydGljYWwgPworICAgICAgICBoZWlnaHRGb3JHbHlwaChh
c3NlbWJseURhdGEudG9wKSArIGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpICsg
aGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLmJvdHRvbSkKKyAgICAgICAgOiBhZHZhbmNlV2lk
dGhGb3JHbHlwaChhc3NlbWJseURhdGEubGVmdCkgKyBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3Nl
bWJseURhdGEubWlkZGxlKSArIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5yaWdo
dCk7CisgICAgaWYgKG1pblNpemUgPiB0YXJnZXRTaXplKQorICAgICAgICByZXR1cm47CiAKLSAg
ICByZXR1cm4gYXNzZW1ibHlEYXRhOworICAgIHNldEdseXBoQXNzZW1ibHkoYXNzZW1ibHlEYXRh
KTsKIH0KIAogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUoKQpAQCAtNjMy
LDcgKzYxMSw4IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnVwZGF0ZVN0eWxlKCkKICAg
ICBpZiAoIWZpcnN0Q2hpbGQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9zdHJldGNoeURh
dGEuc2V0Tm9ybWFsTW9kZSgpOworICAgIG1fc3RyZXRjaFR5cGUgPSBVbnN0cmV0Y2hlZDsKKyAg
ICBtX2l0YWxpY0NvcnJlY3Rpb24gPSAwOwogICAgIC8vIFdlIGFkZCBzcGFjaW5nIGFyb3VuZCB0
aGUgb3BlcmF0b3IuCiAgICAgLy8gRklYTUU6IFRoZSBzcGFjaW5nIHNob3VsZCBiZSBhZGRlZCB0
byB0aGUgd2hvbGUgZW1iZWxsaXNoZWQgb3BlcmF0b3IgKGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMjQ4MzEpLgogICAgIC8vIEZJWE1FOiBUaGUgc3BhY2luZyBzaG91
bGQgb25seSBiZSBhZGRlZCBpbnNpZGUgKHBlcmhhcHMgaW5mZXJyZWQpIG1yb3cgKGh0dHA6Ly93
d3cudzMub3JnL1RSL01hdGhNTC9jaGFwdGVyMy5odG1sI3ByZXNtLm9wc3BhY2luZykuCkBAIC02
NDcsMjcgKzYyNywyNCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgp
CiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX2lzVmVydGljYWwgJiYgaXNMYXJnZU9wZXJh
dG9ySW5EaXNwbGF5U3R5bGUoKSkKLSAgICAgICAgbV9zdHJldGNoeURhdGEgPSBnZXREaXNwbGF5
U3R5bGVMYXJnZU9wZXJhdG9yKCk7CisgICAgICAgIGZpbmREaXNwbGF5U3R5bGVMYXJnZU9wZXJh
dG9yKCk7CiAgICAgZWxzZSB7Ci0gICAgICAgIC8vIFdlIGRvIG5vdCBzdHJldGNoIGlmIHRoZSBi
YXNlIGdseXBoIGlzIGxhcmdlIGVub3VnaC4KLSAgICAgICAgR2x5cGhEYXRhIGJhc2VHbHlwaCA9
IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV90ZXh0Q29udGVu
dCwgIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKTsKLSAgICAgICAgZmxvYXQgYmFz
ZVNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRGb3JHbHlwaChiYXNlR2x5cGgpIDogYWR2YW5j
ZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBoKTsKLSAgICAgICAgaWYgKHN0cmV0Y2hTaXplKCkgPD0g
YmFzZVNpemUpCisgICAgICAgIGZpbmRTdHJldGNoeURhdGEobnVsbHB0ciwgc3RyZXRjaFNpemUo
KSk7CisgICAgICAgIGlmIChtX3N0cmV0Y2hUeXBlID09IFVuc3RyZXRjaGVkKQogICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBtX3N0cmV0Y2h5RGF0YSA9IGZpbmRTdHJldGNoeURhdGEobV90
ZXh0Q29udGVudCwgbnVsbHB0cik7CiAgICAgfQogCi0gICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBt
X3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1NpemVWYXJpYW50KSB7CisgICAgaWYgKG1faXNW
ZXJ0aWNhbCAmJiBtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJpYW50KSB7CiAgICAgICAgIC8vIFdl
IHJlc2l6ZSB0aGUgb3BlcmF0b3IgdG8gbWF0Y2ggdGhlIG9uZSBvZiB0aGUgc2l6ZSB2YXJpYW50
LgogICAgICAgICBpZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSkgewotICAgICAg
ICAgICAgLy8gVGhlIHN0cmV0Y2ggc2l6ZSBpcyBhY3R1YWxseSBub3QgaW52b2x2ZWQgaW4gdGhl
IHNlbGVjdGlvbiBvZiB0aGUgc2l6ZSB2YXJpYW50IGluIGdldERpc3BsYXlTdHlsZUxhcmdlT3Bl
cmF0b3IuCisgICAgICAgICAgICAvLyBUaGUgc3RyZXRjaCBzaXplIGlzIGFjdHVhbGx5IG5vdCBp
bnZvbHZlZCBpbiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBzaXplIHZhcmlhbnQgaW4gZmluZERpc3Bs
YXlTdHlsZUxhcmdlT3BlcmF0b3IuCiAgICAgICAgICAgICAvLyBXZSBzaW1wbHkgdXNlIHRoZSBo
ZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBzZWxlY3RlZCBzaXplIHZhcmlhbnQgZ2x5cGguCi0gICAg
ICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5
RGF0YS52YXJpYW50KCkpOworICAgICAgICAgICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91
bmRzRm9yR2x5cGgobV92YXJpYW50KTsKICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3Zl
QmFzZWxpbmUgPSAtZ2x5cGhCb3VuZHMueSgpOwogICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhC
ZWxvd0Jhc2VsaW5lID0gZ2x5cGhCb3VuZHMubWF4WSgpOwogICAgICAgICB9IGVsc2UgewogICAg
ICAgICAgICAgLy8gV2UgcmVzY2FsZSB0aGUgaGVpZ2h0IGFuZCBkZXB0aCBwcm9wb3J0aW9uYXRl
bHkuCi0gICAgICAgICAgICBmbG9hdCB2YXJpYW50U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fc3Ry
ZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgICAgICBmbG9hdCB2YXJpYW50U2l6ZSA9IGhl
aWdodEZvckdseXBoKG1fdmFyaWFudCk7CiAgICAgICAgICAgICBmbG9hdCBzaXplID0gc3RyZXRj
aFNpemUoKTsKICAgICAgICAgICAgIGZsb2F0IGFzcGVjdCA9IHNpemUgPiAwID8gdmFyaWFudFNp
emUgLyBzaXplIDogMS4wOwogICAgICAgICAgICAgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGlu
ZSAqPSBhc3BlY3Q7CkBAIC02NzYsMzAgKzY1MywzMCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJh
dG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgfQogCiAgICAgaWYgKCFtX2lzVmVydGljYWwpIHsKLSAg
ICAgICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsKLSAg
ICAgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRj
aHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgIGlmIChtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJp
YW50KSB7CisgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlw
aChtX3ZhcmlhbnQpOwogICAgICAgICAgICAgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSA9
IC1nbHlwaEJvdW5kcy55KCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxp
bmUgPSBnbHlwaEJvdW5kcy5tYXhZKCk7Ci0gICAgICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFk
dmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7Ci0gICAgICAgIH0g
ZWxzZSBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KSB7Cisg
ICAgICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fdmFyaWFu
dCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9zdHJldGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KSB7
CiAgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHM7CiAgICAgICAgICAgICBtX3N0cmV0
Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gMDsKICAgICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVs
b3dCYXNlbGluZSA9IDA7CiAKLSAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5
cGgobV9zdHJldGNoeURhdGEubGVmdCgpKTsKKyAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91
bmRzRm9yR2x5cGgobV9hc3NlbWJseS5sZWZ0KTsKICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdo
dEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hIZWlnaHRBYm92
ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAgICAgICAgICAgIG1fc3RyZXRjaERlcHRo
QmVsb3dCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+KG1fc3RyZXRjaERlcHRoQmVsb3dC
YXNlbGluZSwgZ2x5cGhCb3VuZHMubWF4WSgpKTsKIAotICAgICAgICAgICAgZ2x5cGhCb3VuZHMg
PSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5yaWdodCgpKTsKKyAgICAgICAgICAgIGds
eXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5yaWdodCk7CiAgICAgICAgICAg
ICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9z
dHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAg
ICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0
cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAg
ICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9u
KCkpOworICAgICAgICAgICAgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5
LmV4dGVuc2lvbik7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0g
c3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBo
Qm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBz
dGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91
bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5n
bHlwaCkgewotICAgICAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9z
dHJldGNoeURhdGEubWlkZGxlKCkpOworICAgICAgICAgICAgaWYgKG1fYXNzZW1ibHkubWlkZGxl
LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5
cGgobV9hc3NlbWJseS5taWRkbGUpOwogICAgICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFi
b3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hIZWlnaHRBYm92ZUJh
c2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAgICAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0
aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93
QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAgICAgICAgICAgICB9CkBAIC03MDksMTQg
KzY4NiwxNCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAKIE9w
dGlvbmFsPGludD4gUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpcnN0TGluZUJhc2VsaW5lKCkgY29u
c3QKIHsKLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpICE9IERyYXdOb3JtYWwpCisgICAg
aWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNoZWQpCiAgICAgICAgIHJldHVybiBPcHRpb25h
bDxpbnQ+KG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUpOwogICAgIHJldHVybiBSZW5kZXJN
YXRoTUxUb2tlbjo6Zmlyc3RMaW5lQmFzZWxpbmUoKTsKIH0KIAogdm9pZCBSZW5kZXJNYXRoTUxP
cGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQoTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBM
YXlvdXRVbml0IGxvZ2ljYWxUb3AsIExvZ2ljYWxFeHRlbnRDb21wdXRlZFZhbHVlcyYgY29tcHV0
ZWRWYWx1ZXMpIGNvbnN0CiB7Ci0gICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSAhPSBEcmF3
Tm9ybWFsKQorICAgIGlmIChtX3N0cmV0Y2hUeXBlICE9IFVuc3RyZXRjaGVkKQogICAgICAgICBs
b2dpY2FsSGVpZ2h0ID0gbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSArIG1fc3RyZXRjaERl
cHRoQmVsb3dCYXNlbGluZTsKICAgICBSZW5kZXJCb3g6OmNvbXB1dGVMb2dpY2FsSGVpZ2h0KGxv
Z2ljYWxIZWlnaHQsIGxvZ2ljYWxUb3AsIGNvbXB1dGVkVmFsdWVzKTsKIH0KQEAgLTc3Niw4ICs3
NTMsOCBAQCBMYXlvdXRSZWN0IFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludEdseXBoKFBhaW50
SW5mbyYgaW5mbywgY29uc3QgR2x5cGhEYXRhJiBkYQogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3Qg
TGF5b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91dFBvaW50JiB0bykKIHsKICAgICBBU1NFUlQo
bV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdH
bHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCkuZ2x5
cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBlID09IEdseXBoQXNzZW1ibHkpOworICAgIEFT
U0VSVChtX2Fzc2VtYmx5LmV4dGVuc2lvbi5pc1ZhbGlkKCkpOwogICAgIEFTU0VSVChmcm9tLnko
KSA8PSB0by55KCkpOwogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIHRoZSBleHRl
bnNpb24gZ2x5cGgsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCkBAIC03ODYsNyArNzYz
LDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lv
bkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QKIAogICAgIEdyYXBoaWNzQ29udGV4dFN0YXRl
U2F2ZXIgc3RhdGVTYXZlcihpbmZvLmNvbnRleHQoKSk7CiAKLSAgICBGbG9hdFJlY3QgZ2x5cGhC
b3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5leHRlbnNpb24oKSk7CisgICAg
RmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5leHRlbnNp
b24pOwogCiAgICAgLy8gQ2xpcHBpbmcgdGhlIGV4dGVuZGVyIHJlZ2lvbiBoZXJlIGFsbG93cyB1
cyB0byBkcmF3IHRoZSBib3R0b20gZXh0ZW5kZXIgZ2x5cGggaW50byB0aGUKICAgICAvLyByZWdp
b25zIG9mIHRoZSBib3R0b20gZ2x5cGggd2l0aG91dCB3b3JyeWluZyBhYm91dCBvdmVyZHJhdyAo
aGFpcnkgcGl4ZWxzKSBhbmQgc2ltcGxpZmllcyBsYXRlciBjbGlwcGluZy4KQEAgLTgwMSw3ICs3
NzgsNyBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aFZlcnRpY2FsRXh0ZW5z
aW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25zdAogICAgIEZsb2F0UmVjdCBsYXN0UGFpbnRl
ZEdseXBoUmVjdChmcm9tLCBGbG9hdFNpemUoKSk7CiAKICAgICB3aGlsZSAobGFzdFBhaW50ZWRH
bHlwaFJlY3QubWF4WSgpIDwgdG8ueSgpKSB7Ci0gICAgICAgIGxhc3RQYWludGVkR2x5cGhSZWN0
ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5leHRlbnNpb24oKSwgZ2x5cGhPcmln
aW4sIFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAgICBsYXN0UGFpbnRlZEdseXBoUmVjdCA9IHBh
aW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5leHRlbnNpb24sIGdseXBoT3JpZ2luLCBUcmltVG9w
QW5kQm90dG9tKTsKICAgICAgICAgZ2x5cGhPcmlnaW4uc2V0WShnbHlwaE9yaWdpbi55KCkgKyBs
YXN0UGFpbnRlZEdseXBoUmVjdC5oZWlnaHQoKSk7CiAKICAgICAgICAgLy8gVGhlcmUncyBhIGNo
YW5jZSB0aGF0IGlmIHRoZSBmb250IHNpemUgaXMgc21hbGwgZW5vdWdoIHRoZSBnbHVlIGdseXBo
IGhhcyBiZWVuIHJlZHVjZWQgdG8gYW4gZW1wdHkgcmVjdGFuZ2xlCkBAIC04MTQsOCArNzkxLDgg
QEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkds
eXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZp
bGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5
b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91dFBvaW50JiB0bykKIHsKICAgICBBU1NFUlQoIW1f
aXNWZXJ0aWNhbCk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5
cGhBc3NlbWJseSk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpLmdseXBo
KTsKKyAgICBBU1NFUlQobV9zdHJldGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KTsKKyAgICBBU1NF
UlQobV9hc3NlbWJseS5leHRlbnNpb24uaXNWYWxpZCgpKTsKICAgICBBU1NFUlQoZnJvbS54KCkg
PD0gdG8ueCgpKTsKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgZXh0ZW5z
aW9uIGdseXBoLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgpAQCAtODM3LDcgKzgxNCw3
IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lv
bkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uCiAgICAgRmxvYXRSZWN0IGxhc3RQYWludGVkR2x5
cGhSZWN0KGZyb20sIEZsb2F0U2l6ZSgpKTsKIAogICAgIHdoaWxlIChsYXN0UGFpbnRlZEdseXBo
UmVjdC5tYXhYKCkgPCB0by54KCkpIHsKLSAgICAgICAgbGFzdFBhaW50ZWRHbHlwaFJlY3QgPSBw
YWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpLCBnbHlwaE9yaWdpbiwg
VHJpbUxlZnRBbmRSaWdodCk7CisgICAgICAgIGxhc3RQYWludGVkR2x5cGhSZWN0ID0gcGFpbnRH
bHlwaChpbmZvLCBtX2Fzc2VtYmx5LmV4dGVuc2lvbiwgZ2x5cGhPcmlnaW4sIFRyaW1MZWZ0QW5k
UmlnaHQpOwogICAgICAgICBnbHlwaE9yaWdpbi5zZXRYKGdseXBoT3JpZ2luLngoKSArIGxhc3RQ
YWludGVkR2x5cGhSZWN0LndpZHRoKCkpOwogCiAgICAgICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2Ug
dGhhdCBpZiB0aGUgZm9udCBzaXplIGlzIHNtYWxsIGVub3VnaCB0aGUgZ2x1ZSBnbHlwaCBoYXMg
YmVlbiByZWR1Y2VkIHRvIGFuIGVtcHR5IHJlY3RhbmdsZQpAQCAtODUxLDIwICs4MjgsMjAgQEAg
dm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnQoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBM
YXlvdXRQb2ludCYgcGFpbnRPZmZzZXQKIHsKICAgICBSZW5kZXJNYXRoTUxUb2tlbjo6cGFpbnQo
aW5mbywgcGFpbnRPZmZzZXQpOwogCi0gICAgaWYgKGluZm8uY29udGV4dCgpLnBhaW50aW5nRGlz
YWJsZWQoKSB8fCBpbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHN0eWxlKCku
dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdO
b3JtYWwpCisgICAgaWYgKGluZm8uY29udGV4dCgpLnBhaW50aW5nRGlzYWJsZWQoKSB8fCBpbmZv
LnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHN0eWxlKCkudmlzaWJpbGl0eSgpICE9
IFZJU0lCTEUgfHwgbV9zdHJldGNoVHlwZSA9PSBVbnN0cmV0Y2hlZCkKICAgICAgICAgcmV0dXJu
OwogCiAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKGluZm8uY29udGV4
dCgpKTsKICAgICBpbmZvLmNvbnRleHQoKS5zZXRGaWxsQ29sb3Ioc3R5bGUoKS52aXNpdGVkRGVw
ZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvcikpOwogCi0gICAgaWYgKG1fc3RyZXRjaHlEYXRh
Lm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsKLSAgICAgICAgQVNTRVJUKG1fc3RyZXRjaHlE
YXRhLnZhcmlhbnQoKS5nbHlwaCk7CisgICAgaWYgKG1fc3RyZXRjaFR5cGUgPT0gU2l6ZVZhcmlh
bnQpIHsKKyAgICAgICAgQVNTRVJUKG1fdmFyaWFudC5pc1ZhbGlkKCkpOwogICAgICAgICBHbHlw
aEJ1ZmZlciBidWZmZXI7Ci0gICAgICAgIGJ1ZmZlci5hZGQobV9zdHJldGNoeURhdGEudmFyaWFu
dCgpLmdseXBoLCBtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkuZm9udCwgYWR2YW5jZVdpZHRoRm9y
R2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgpKSk7CisgICAgICAgIGJ1ZmZlci5hZGQobV92
YXJpYW50LmdseXBoLCBtX3ZhcmlhbnQuZm9udCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV92YXJp
YW50KSk7CiAgICAgICAgIExheW91dFBvaW50IG9wZXJhdG9yVG9wTGVmdCA9IGNlaWxlZEludFBv
aW50KHBhaW50T2Zmc2V0ICsgbG9jYXRpb24oKSk7Ci0gICAgICAgIEZsb2F0UmVjdCBnbHlwaEJv
dW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAg
IEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fdmFyaWFudCk7CiAgICAg
ICAgIExheW91dFBvaW50IG9wZXJhdG9yT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIG9wZXJh
dG9yVG9wTGVmdC55KCkgLSBnbHlwaEJvdW5kcy55KCkpOwotICAgICAgICBpbmZvLmNvbnRleHQo
KS5kcmF3R2x5cGhzKHN0eWxlKCkuZm9udENhc2NhZGUoKSwgKm1fc3RyZXRjaHlEYXRhLnZhcmlh
bnQoKS5mb250LCBidWZmZXIsIDAsIDEsIG9wZXJhdG9yT3JpZ2luKTsKKyAgICAgICAgaW5mby5j
b250ZXh0KCkuZHJhd0dseXBocyhzdHlsZSgpLmZvbnRDYXNjYWRlKCksICptX3ZhcmlhbnQuZm9u
dCwgYnVmZmVyLCAwLCAxLCBvcGVyYXRvck9yaWdpbik7CiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKQEAgLTg3NywzMCArODU0LDMwIEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50
KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0CiB2b2lkIFJl
bmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRpY2FsR2x5cGhBc3NlbWJseShQYWludEluZm8m
IGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCkKIHsKICAgICBBU1NFUlQobV9p
c1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdHbHlw
aEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEudG9wKCkuZ2x5cGgpOwotICAg
IEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5ib3R0b20oKS5nbHlwaCk7CisgICAgQVNTRVJUKG1fc3Ry
ZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkudG9wLmlz
VmFsaWQoKSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkuYm90dG9tLmlzVmFsaWQoKSk7CiAKICAg
ICAvLyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGdseXBocyBzbyB0aGF0IHRoZSBlZGdlIG9mIHRo
ZSB0aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBleGFjdGx5IHdpdGggdGhlIGVkZ2VzIG9mIG91
ciBwYWludCBib3guCiAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JUb3BMZWZ0ID0gcGFpbnRPZmZz
ZXQgKyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9yVG9wTGVmdC5tb3ZlKHN0eWxlKCkuaXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpID8gbV9sZWFkaW5nU3BhY2UgOiBtX3RyYWlsaW5nU3BhY2UsIDAp
OwogICAgIG9wZXJhdG9yVG9wTGVmdCA9IGNlaWxlZEludFBvaW50KG9wZXJhdG9yVG9wTGVmdCk7
Ci0gICAgRmxvYXRSZWN0IHRvcEdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNo
eURhdGEudG9wKCkpOworICAgIEZsb2F0UmVjdCB0b3BHbHlwaEJvdW5kcyA9IGJvdW5kc0Zvckds
eXBoKG1fYXNzZW1ibHkudG9wKTsKICAgICBMYXlvdXRQb2ludCB0b3BHbHlwaE9yaWdpbihvcGVy
YXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExlZnQueSgpIC0gdG9wR2x5cGhCb3VuZHMueSgp
KTsKLSAgICBMYXlvdXRSZWN0IHRvcEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBt
X3N0cmV0Y2h5RGF0YS50b3AoKSwgdG9wR2x5cGhPcmlnaW4sIFRyaW1Cb3R0b20pOworICAgIExh
eW91dFJlY3QgdG9wR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fYXNzZW1ibHku
dG9wLCB0b3BHbHlwaE9yaWdpbiwgVHJpbUJvdHRvbSk7CiAKLSAgICBGbG9hdFJlY3QgYm90dG9t
R2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5ib3R0b20oKSk7Cisg
ICAgRmxvYXRSZWN0IGJvdHRvbUdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJs
eS5ib3R0b20pOwogICAgIExheW91dFBvaW50IGJvdHRvbUdseXBoT3JpZ2luKG9wZXJhdG9yVG9w
TGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgKyBvZmZzZXRIZWlnaHQoKSAtIChib3R0b21H
bHlwaEJvdW5kcy5oZWlnaHQoKSArIGJvdHRvbUdseXBoQm91bmRzLnkoKSkpOwotICAgIExheW91
dFJlY3QgYm90dG9tR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlE
YXRhLmJvdHRvbSgpLCBib3R0b21HbHlwaE9yaWdpbiwgVHJpbVRvcCk7CisgICAgTGF5b3V0UmVj
dCBib3R0b21HbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5ib3R0
b20sIGJvdHRvbUdseXBoT3JpZ2luLCBUcmltVG9wKTsKIAotICAgIGlmIChtX3N0cmV0Y2h5RGF0
YS5taWRkbGUoKS5nbHlwaCkgeworICAgIGlmIChtX2Fzc2VtYmx5Lm1pZGRsZS5pc1ZhbGlkKCkp
IHsKICAgICAgICAgLy8gQ2VudGVyIHRoZSBnbHlwaCBvcmlnaW4gYmV0d2VlbiB0aGUgc3RhcnQg
YW5kIGVuZCBnbHlwaCBwYWludCBleHRlbnRzLiBUaGVuIHNoaWZ0IGl0IGhhbGYgdGhlIHBhaW50
IGhlaWdodCB0b3dhcmQgdGhlIGJvdHRvbSBnbHlwaC4KLSAgICAgICAgRmxvYXRSZWN0IG1pZGRs
ZUdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubWlkZGxlKCkpOwor
ICAgICAgICBGbG9hdFJlY3QgbWlkZGxlR2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX2Fz
c2VtYmx5Lm1pZGRsZSk7CiAgICAgICAgIExheW91dFBvaW50IG1pZGRsZUdseXBoT3JpZ2luKG9w
ZXJhdG9yVG9wTGVmdC54KCksIHRvcEdseXBoT3JpZ2luLnkoKSk7CiAgICAgICAgIG1pZGRsZUds
eXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgwLCAoYm90dG9tR2x5cGhQYWludFJlY3QueSgp
IC0gdG9wR2x5cGhQYWludFJlY3QubWF4WSgpKSAvIDIuMCkpOwogICAgICAgICBtaWRkbGVHbHlw
aE9yaWdpbi5tb3ZlQnkoTGF5b3V0UG9pbnQoMCwgbWlkZGxlR2x5cGhCb3VuZHMuaGVpZ2h0KCkg
LyAyLjApKTsKIAotICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFp
bnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKSwgbWlkZGxlR2x5cGhPcmlnaW4s
IFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRS
ZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5Lm1pZGRsZSwgbWlkZGxlR2x5cGhPcmln
aW4sIFRyaW1Ub3BBbmRCb3R0b20pOwogICAgICAgICBmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9u
R2x5cGgoaW5mbywgdG9wR2x5cGhQYWludFJlY3QubWluWE1heFlDb3JuZXIoKSwgbWlkZGxlR2x5
cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgICAgIGZpbGxXaXRoVmVydGljYWxF
eHRlbnNpb25HbHlwaChpbmZvLCBtaWRkbGVHbHlwaFBhaW50UmVjdC5taW5YTWF4WUNvcm5lcigp
LCBib3R0b21HbHlwaFBhaW50UmVjdC5taW5YTWluWUNvcm5lcigpKTsKICAgICB9IGVsc2UKQEAg
LTkxMCwyNiArODg3LDI2IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50VmVydGlj
YWxHbHlwaEFzc2VtYmx5KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5CiB2b2lkIFJlbmRlck1h
dGhNTE9wZXJhdG9yOjpwYWludEhvcml6b250YWxHbHlwaEFzc2VtYmx5KFBhaW50SW5mbyYgaW5m
bywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0KQogewogICAgIEFTU0VSVCghbV9pc1Zl
cnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdHbHlwaEFz
c2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubGVmdCgpLmdseXBoKTsKLSAgICBB
U1NFUlQobV9zdHJldGNoeURhdGEucmlnaHQoKS5nbHlwaCk7CisgICAgQVNTRVJUKG1fc3RyZXRj
aFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkubGVmdC5pc1Zh
bGlkKCkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LnJpZ2h0LmlzVmFsaWQoKSk7CiAKICAgICAv
LyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGdseXBocyBzbyB0aGF0IHRoZSBlZGdlIG9mIHRoZSB0
aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBleGFjdGx5IHdpdGggdGhlIGVkZ2VzIG9mIG91ciBw
YWludCBib3guCiAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JUb3BMZWZ0ID0gcGFpbnRPZmZzZXQg
KyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9yVG9wTGVmdC5tb3ZlKG1fbGVhZGluZ1NwYWNlLCAw
KTsKICAgICBvcGVyYXRvclRvcExlZnQgPSBjZWlsZWRJbnRQb2ludChvcGVyYXRvclRvcExlZnQp
OwogICAgIExheW91dFBvaW50IGxlZnRHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBv
cGVyYXRvclRvcExlZnQueSgpICsgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSk7Ci0gICAg
TGF5b3V0UmVjdCBsZWZ0R2x5cGhQYWludFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRj
aHlEYXRhLmxlZnQoKSwgbGVmdEdseXBoT3JpZ2luLCBUcmltUmlnaHQpOworICAgIExheW91dFJl
Y3QgbGVmdEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LmxlZnQs
IGxlZnRHbHlwaE9yaWdpbiwgVHJpbVJpZ2h0KTsKIAotICAgIEZsb2F0UmVjdCByaWdodEdseXBo
Qm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEucmlnaHQoKSk7CisgICAgRmxv
YXRSZWN0IHJpZ2h0R2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5LnJpZ2h0
KTsKICAgICBMYXlvdXRQb2ludCByaWdodEdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCkg
KyBvZmZzZXRXaWR0aCgpIC0gcmlnaHRHbHlwaEJvdW5kcy53aWR0aCgpLCBvcGVyYXRvclRvcExl
ZnQueSgpICsgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSk7Ci0gICAgTGF5b3V0UmVjdCBy
aWdodEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5yaWdo
dCgpLCByaWdodEdseXBoT3JpZ2luLCBUcmltTGVmdCk7CisgICAgTGF5b3V0UmVjdCByaWdodEds
eXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LnJpZ2h0LCByaWdodEds
eXBoT3JpZ2luLCBUcmltTGVmdCk7CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEubWlkZGxlKCku
Z2x5cGgpIHsKKyAgICBpZiAobV9hc3NlbWJseS5taWRkbGUuaXNWYWxpZCgpKSB7CiAgICAgICAg
IC8vIENlbnRlciB0aGUgZ2x5cGggb3JpZ2luIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgZ2x5
cGggcGFpbnQgZXh0ZW50cy4KICAgICAgICAgTGF5b3V0UG9pbnQgbWlkZGxlR2x5cGhPcmlnaW4o
b3BlcmF0b3JUb3BMZWZ0LngoKSwgbGVmdEdseXBoT3JpZ2luLnkoKSk7CiAgICAgICAgIG1pZGRs
ZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgocmlnaHRHbHlwaFBhaW50UmVjdC54KCkg
LSBsZWZ0R2x5cGhQYWludFJlY3QubWF4WCgpKSAvIDIuMCwgMCkpOwotICAgICAgICBMYXlvdXRS
ZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0
YS5taWRkbGUoKSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1MZWZ0QW5kUmlnaHQpOworICAgICAg
ICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fz
c2VtYmx5Lm1pZGRsZSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1MZWZ0QW5kUmlnaHQpOwogICAg
ICAgICBmaWxsV2l0aEhvcml6b250YWxFeHRlbnNpb25HbHlwaChpbmZvLCBsZWZ0R2x5cGhQYWlu
dFJlY3QubWF4WE1pbllDb3JuZXIoKSwgbWlkZGxlR2x5cGhQYWludFJlY3QubWluWE1pbllDb3Ju
ZXIoKSk7CiAgICAgICAgIGZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKGluZm8sIG1p
ZGRsZUdseXBoUGFpbnRSZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJpZ2h0R2x5cGhQYWludFJlY3Qu
bWluWE1pbllDb3JuZXIoKSk7CiAgICAgfSBlbHNlCkBAIC05MzksNyArOTE2LDcgQEAgdm9pZCBS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jpem9udGFsR2x5cGhBc3NlbWJseShQYWludElu
Zm8mIGluZm8sIGNvbnN0IEwKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50Q2hpbGRy
ZW4oUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwg
UGFpbnRJbmZvJiBwYWludEluZm9Gb3JDaGlsZCwgYm9vbCB1c2VQcmludFJlY3QpCiB7CiAgICAg
Ly8gV2Ugc2tpcCBwYWludGluZyBmb3IgaW52aXNpYmxlIG9wZXJhdG9ycyB0b28gdG8gYXZvaWQg
c29tZSAibWlzc2luZyBjaGFyYWN0ZXIiIGdseXBoIHRvIGFwcGVhciBpZiBhcHByb3ByaWF0ZSBt
YXRoIGZvbnRzIGFyZSBub3QgYXZhaWxhYmxlLgotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2Rl
KCkgIT0gRHJhd05vcm1hbCB8fCBpc0ludmlzaWJsZU9wZXJhdG9yKCkpCisgICAgaWYgKG1fc3Ry
ZXRjaFR5cGUgIT0gVW5zdHJldGNoZWQgfHwgaXNJbnZpc2libGVPcGVyYXRvcigpKQogICAgICAg
ICByZXR1cm47CiAgICAgUmVuZGVyTWF0aE1MVG9rZW46OnBhaW50Q2hpbGRyZW4ocGFpbnRJbmZv
LCBwYWludE9mZnNldCwgcGFpbnRJbmZvRm9yQ2hpbGQsIHVzZVByaW50UmVjdCk7CiB9CkBAIC05
NTQsMTkgKzkzMSwxOSBAQCBMYXlvdXRVbml0IFJlbmRlck1hdGhNTE9wZXJhdG9yOjp0cmFpbGlu
Z1NwYWNlRXJyb3IoKQogICAgIC8vIEhlbmNlIHdlIGRldGVybWluZSB0aGUgZXJyb3IgaW4gdGhl
IGxvZ2ljYWwgd2lkdGggd2l0aCByZXNwZWN0IHRvIHRoZSBhY3R1YWwgd2lkdGggb2YgdGhlIGds
eXBoKHMpIHVzZWQgdG8gcGFpbnQgdGhlIG9wZXJhdG9yLgogICAgIExheW91dFVuaXQgd2lkdGgg
PSBsb2dpY2FsV2lkdGgoKTsKIAotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJh
d05vcm1hbCkgeworICAgIGlmIChtX3N0cmV0Y2hUeXBlID09IFVuc3RyZXRjaGVkKSB7CiAgICAg
ICAgIEdseXBoRGF0YSBkYXRhID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNo
YXJhY3Rlcih0ZXh0Q29udGVudCgpLCAhc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkp
OwogICAgICAgICByZXR1cm4gd2lkdGggLSBhZHZhbmNlV2lkdGhGb3JHbHlwaChkYXRhKTsKICAg
ICB9CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdTaXplVmFyaWFudCkK
LSAgICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURh
dGEudmFyaWFudCgpKTsKKyAgICBpZiAobV9zdHJldGNoVHlwZSA9PSBTaXplVmFyaWFudCkKKyAg
ICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5jZVdpZHRoRm9yR2x5cGgobV92YXJpYW50KTsKIAot
ICAgIGZsb2F0IGFzc2VtYmx5V2lkdGggPSBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX3N0cmV0Y2h5
RGF0YS50b3AoKSk7Ci0gICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgs
IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmJvdHRvbSgpKSk7Ci0gICAgYXNz
ZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBo
KG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpKSk7Ci0gICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1p
ZGRsZSgpLmdseXBoKQotICAgICAgICBhc3NlbWJseVdpZHRoID0gc3RkOjptYXgoYXNzZW1ibHlX
aWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEubWlkZGxlKCkpKTsKKyAg
ICBmbG9hdCBhc3NlbWJseVdpZHRoID0gYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9hc3NlbWJseS50
b3ApOworICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNl
V2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5LmJvdHRvbSkpOworICAgIGFzc2VtYmx5V2lkdGggPSBz
dGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5LmV4
dGVuc2lvbikpOworICAgIGlmIChtX2Fzc2VtYmx5Lm1pZGRsZS5pc1ZhbGlkKCkpCisgICAgICAg
IGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JH
bHlwaChtX2Fzc2VtYmx5Lm1pZGRsZSkpOwogICAgIHJldHVybiB3aWR0aCAtIGFzc2VtYmx5V2lk
dGg7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVu
ZGVyTWF0aE1MT3BlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVu
ZGVyTWF0aE1MT3BlcmF0b3IuaAppbmRleCBiYjNmODFmLi4wYmFmYTJiIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5o
CkBAIC01MSw3ICs1MSw3IEBAIHB1YmxpYzoKICAgICAvLyBGSVhNRTogVGhlIGRpc3BsYXlzdHls
ZSBwcm9wZXJ0eSBpcyBub3QgaW1wbGVtZW50ZWQgKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xMTg3MzcpLgogICAgIGJvb2wgaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5
U3R5bGUoKSBjb25zdCB7IHJldHVybiAhaGFzT3BlcmF0b3JGbGFnKE1hdGhNTE9wZXJhdG9yRGlj
dGlvbmFyeTo6U3RyZXRjaHkpICYmIGhhc09wZXJhdG9yRmxhZyhNYXRoTUxPcGVyYXRvckRpY3Rp
b25hcnk6OkxhcmdlT3ApOyB9CiAgICAgYm9vbCBpc1ZlcnRpY2FsKCkgY29uc3QgeyByZXR1cm4g
bV9pc1ZlcnRpY2FsOyB9Ci0gICAgTGF5b3V0VW5pdCBpdGFsaWNDb3JyZWN0aW9uKCkgY29uc3Q7
CisgICAgTGF5b3V0VW5pdCBpdGFsaWNDb3JyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9pdGFs
aWNDb3JyZWN0aW9uOyB9CiAKICAgICB2b2lkIHN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5j
ZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKSBmaW5hbDsKICAgICB2b2lkIHVwZGF0ZVN0
eWxlKCkgZmluYWw7CkBAIC03Myw2MCArNzMsMzEgQEAgcHJvdGVjdGVkOgogICAgIFVDaGFyIHRl
eHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQogCiBwcml2YXRlOgot
ICAgIGVudW0gRHJhd01vZGUgewotICAgICAgICBEcmF3Tm9ybWFsLCBEcmF3U2l6ZVZhcmlhbnQs
IERyYXdHbHlwaEFzc2VtYmx5CisgICAgc3RydWN0IEdseXBoQXNzZW1ibHlEYXRhIHsKKyAgICAg
ICAgdW5pb24geworICAgICAgICAgICAgR2x5cGhEYXRhIHRvcDsKKyAgICAgICAgICAgIEdseXBo
RGF0YSByaWdodDsKKyAgICAgICAgfTsKKyAgICAgICAgR2x5cGhEYXRhIGV4dGVuc2lvbjsKKyAg
ICAgICAgdW5pb24geworICAgICAgICAgICAgR2x5cGhEYXRhIGJvdHRvbTsKKyAgICAgICAgICAg
IEdseXBoRGF0YSBsZWZ0OworICAgICAgICB9OworICAgICAgICBHbHlwaERhdGEgbWlkZGxlOwor
ICAgIEdseXBoQXNzZW1ibHlEYXRhKCkKKyAgICA6IHRvcCgpLCBleHRlbnNpb24oKSwgYm90dG9t
KCksIG1pZGRsZSgpIHsgfQogICAgIH07Ci0KLSAgICBjbGFzcyBTdHJldGNoeURhdGEgewotICAg
IHB1YmxpYzoKLSAgICAgICAgRHJhd01vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZTsg
fQotICAgICAgICBHbHlwaERhdGEgdmFyaWFudCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVswXTsg
fQotICAgICAgICBHbHlwaERhdGEgdG9wKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzBdOyB9Ci0g
ICAgICAgIEdseXBoRGF0YSBleHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMV07IH0K
LSAgICAgICAgR2x5cGhEYXRhIGJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVsyXTsgfQot
ICAgICAgICBHbHlwaERhdGEgbWlkZGxlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzNdOyB9Ci0g
ICAgICAgIEdseXBoRGF0YSBsZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzJdOyB9Ci0gICAg
ICAgIEdseXBoRGF0YSByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVswXTsgfQotCi0gICAg
ICAgIHZvaWQgc2V0Tm9ybWFsTW9kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbW9kZSA9
IERyYXdOb3JtYWw7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRTaXplVmFyaWFudE1vZGUo
Y29uc3QgR2x5cGhEYXRhJiB2YXJpYW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX21vZGUg
PSBEcmF3U2l6ZVZhcmlhbnQ7Ci0gICAgICAgICAgICBtX2RhdGFbMF0gPSB2YXJpYW50OwotICAg
ICAgICB9Ci0gICAgICAgIHZvaWQgc2V0R2x5cGhBc3NlbWJseU1vZGUoY29uc3QgR2x5cGhEYXRh
JiB0b3AsIGNvbnN0IEdseXBoRGF0YSYgZXh0ZW5zaW9uLCBjb25zdCBHbHlwaERhdGEmIGJvdHRv
bSwgY29uc3QgR2x5cGhEYXRhJiBtaWRkbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbW9k
ZSA9IERyYXdHbHlwaEFzc2VtYmx5OwotICAgICAgICAgICAgbV9kYXRhWzBdID0gdG9wOwotICAg
ICAgICAgICAgbV9kYXRhWzFdID0gZXh0ZW5zaW9uOwotICAgICAgICAgICAgbV9kYXRhWzJdID0g
Ym90dG9tOwotICAgICAgICAgICAgbV9kYXRhWzNdID0gbWlkZGxlOwotICAgICAgICB9Ci0gICAg
ICAgIFN0cmV0Y2h5RGF0YSgpCi0gICAgICAgICAgICA6IG1fbW9kZShEcmF3Tm9ybWFsKSB7IH0K
LSAgICAgICAgU3RyZXRjaHlEYXRhKGNvbnN0IFN0cmV0Y2h5RGF0YSYgZGF0YSkKLSAgICAgICAg
ewotICAgICAgICAgICAgc3dpdGNoIChkYXRhLm1fbW9kZSkgewotICAgICAgICAgICAgY2FzZSBE
cmF3Tm9ybWFsOgotICAgICAgICAgICAgICAgIHNldE5vcm1hbE1vZGUoKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRHJhd1NpemVWYXJpYW50OgotICAgICAgICAg
ICAgICAgIHNldFNpemVWYXJpYW50TW9kZShkYXRhLnZhcmlhbnQoKSk7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERyYXdHbHlwaEFzc2VtYmx5OgotICAgICAgICAg
ICAgICAgIHNldEdseXBoQXNzZW1ibHlNb2RlKGRhdGEudG9wKCksIGRhdGEuZXh0ZW5zaW9uKCks
IGRhdGEuYm90dG9tKCksIGRhdGEubWlkZGxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBEcmF3TW9k
ZSBtX21vZGU7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3IgT3BlblR5cGUgZm9udHMgd2l0aCBhIE1B
VEggdGFibGUgYWxsIHRoZSBnbHlwaHMgYXJlIGZyb20gdGhlIHNhbWUgZm9udCwgc28gd2Ugd291
bGQgb25seSBuZWVkIHRvIHN0b3JlIHRoZSBnbHlwaCBpbmRpY2VzIGhlcmUuCi0gICAgICAgIEds
eXBoRGF0YSBtX2RhdGFbNF07CisgICAgZW51bSBTdHJldGNoVHlwZSB7CisgICAgICAgIFVuc3Ry
ZXRjaGVkLAorICAgICAgICBTaXplVmFyaWFudCwKKyAgICAgICAgR2x5cGhBc3NlbWJseQorICAg
IH07CisgICAgU3RyZXRjaFR5cGUgbV9zdHJldGNoVHlwZTsKKyAgICB1bmlvbiB7CisgICAgICAg
IEdseXBoRGF0YSBtX3ZhcmlhbnQ7CisgICAgICAgIEdseXBoQXNzZW1ibHlEYXRhIG1fYXNzZW1i
bHk7CiAgICAgfTsKKyAgICBMYXlvdXRVbml0IG1faXRhbGljQ29ycmVjdGlvbjsKIAogICAgIGNv
bnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBpc0Fub255bW91
cygpID8gIlJlbmRlck1hdGhNTE9wZXJhdG9yIChhbm9ueW1vdXMpIiA6ICJSZW5kZXJNYXRoTUxP
cGVyYXRvciI7IH0KICAgICB2b2lkIHBhaW50Q2hpbGRyZW4oUGFpbnRJbmZvJiBmb3JTZWxmLCBj
b25zdCBMYXlvdXRQb2ludCYsIFBhaW50SW5mbyYgZm9yQ2hpbGQsIGJvb2wgdXNlUHJpbnRSZWN0
KSBmaW5hbDsKQEAgLTE0Miw5ICsxMTMsMTEgQEAgcHJpdmF0ZToKICAgICBib29sIHNob3VsZEFs
bG93U3RyZXRjaGluZygpIGNvbnN0OwogCiAgICAgYm9vbCBnZXRCYXNlR2x5cGgoY29uc3QgUmVu
ZGVyU3R5bGUmLCBHbHlwaERhdGEmKSBjb25zdDsKLSAgICBib29sIGdldEdseXBoQXNzZW1ibHlG
YWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0PiwgU3RyZXRjaHlE
YXRhJikgY29uc3Q7Ci0gICAgU3RyZXRjaHlEYXRhIGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0
b3IoKSBjb25zdDsKLSAgICBTdHJldGNoeURhdGEgZmluZFN0cmV0Y2h5RGF0YShVQ2hhciwgZmxv
YXQqIG1heGltdW1HbHlwaFdpZHRoKTsKKyAgICB2b2lkIHNldFNpemVWYXJpYW50KGNvbnN0IEds
eXBoRGF0YSYpOworICAgIHZvaWQgc2V0R2x5cGhBc3NlbWJseShjb25zdCBHbHlwaEFzc2VtYmx5
RGF0YSYpOworICAgIGJvb2wgZ2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlw
ZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+LCBHbHlwaEFzc2VtYmx5RGF0YSYpIGNvbnN0OworICAg
IHZvaWQgZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKKyAgICB2b2lkIGZpbmRTdHJl
dGNoeURhdGEoZmxvYXQqIG1heGltdW1HbHlwaFdpZHRoLCBMYXlvdXRVbml0IHRhcmdldFNpemUg
PSAwKTsKIAogICAgIGVudW0gR2x5cGhQYWludFRyaW1taW5nIHsKICAgICAgICAgVHJpbVRvcCwK
QEAgLTE3Niw3ICsxNDksNiBAQCBwcml2YXRlOgogICAgIExheW91dFVuaXQgbV90cmFpbGluZ1Nw
YWNlOwogICAgIExheW91dFVuaXQgbV9taW5TaXplOwogICAgIExheW91dFVuaXQgbV9tYXhTaXpl
OwotICAgIFN0cmV0Y2h5RGF0YSBtX3N0cmV0Y2h5RGF0YTsKIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>277230</attachid>
            <date>2016-04-25 00:49:04 -0700</date>
            <delta_ts>2016-04-27 05:56:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>0002-GlyphAssemblyData.patch</filename>
            <type>text/plain</type>
            <size>42301</size>
            <attacher name="Frédéric Wang Nélar">fred.wang</attacher>
            
              <data encoding="base64">RnJvbSA4NDkzM2FlOWY1YTAzNWU5MWU0MjVmODE0YWM5OTQ5Y2I0MTc5Y2E4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBGcmVkZXJpYyBXYW5nIDxmcmVkLndhbmdAZnJlZS5mcj4KRGF0
ZTogRnJpLCAyMiBBcHIgMjAxNiAxODo0OToxNSArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMi80XSBH
bHlwaEFzc2VtYmx5RGF0YQoKLS0tCiBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8ICA1NSArKysrCiAuLi4vcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxPcGVyYXRvci5jcHAgICAgICB8IDI5OSArKysrKysrKysrLS0tLS0tLS0tLS0KIC4uLi9y
ZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmggICAgICAgIHwgIDg2ICsrLS0t
LQogMyBmaWxlcyBjaGFuZ2VkLCAyMjIgaW5zZXJ0aW9ucygrKSwgMjE4IGRlbGV0aW9ucygtKQoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBhMTQ5MTBhLi43MTFhMjdmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTgg
QEAKKzIwMTYtMDQtMjIgIEZyZWRlcmljIFdhbmcgIDxmd2FuZ0BpZ2FsaWEuY29tPgorCisgICAg
ICAgIFJlbmRlck1hdGhNTE9wZXJhdG9yOiByZWZhY3RvciBtYW5hZ2VtZW50IG9mIHN0cmV0Y2h5
IGRhdGEgYW5kIGl0YWxpYyBjb3JyZWN0aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY5MTMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlaGF2aW9yIGlzIG5vdCBjaGFuZ2Vk
LgorCisgICAgICAgIFdlIHVzZSB1bmlvbiB0byBzaW1wbGlmeSB0aGUgc3RydWN0dXJlIHVzZWQg
dG8gbWFuYWdlIHRoZSBnbHlwaCBhc3NlbWJseSBhbmQgdGhlIHR5cGUgb2Ygc3RyZXRjaGluZy4K
KyAgICAgICAgV2UgYWxzbyBtb2RpZnkgdGhlIHNpZ25hdHVyZSBvZiBzb21lIGZ1bmN0aW9ucyB0
byByZXRyaWV2ZSBkaXNwbGF5IG9wZXJhdG9yIGFuZCBzdHJldGNoeSBkYXRhLgorICAgICAgICBG
aW5hbGx5LCB3ZSBpbnRyb2R1Y2Ugc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGVhc2lseSBzZXQg
dGhlIHN0cmV0Y2h5IGRhdGEuCisKKyAgICAgICAgKiByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1h
dGhNTE9wZXJhdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9y
Ojpjb21wdXRlUHJlZmVycmVkTG9naWNhbFdpZHRocyk6IFVzZSB0aGUgbmV3IGRhdGEgbWVtYmVy
cyBhbmQgZnVuY3Rpb24gc2lnbmF0dXJlcy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjpzZXRTaXplVmFyaWFudCk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGEg
c2l6ZSB2YXJpYW50LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnNl
dEdseXBoQXNzZW1ibHkpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIGdseXBoIGFzc2Vt
Ymx5LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNz
ZW1ibHlGYWxsQmFjayk6IFdlIGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIHVzZSBhIEdseXBoQXNz
ZW1ibHlEYXRhLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRE
aXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKTogV2UgcmVuYW1lIHRoZSBmdW5jdGlvbiBhbmQKKyAg
ICAgICAgY2hhbmdlIGl0cyBzaWduYXR1cmUgdG8gcmVtb3ZlIHRoZSByZXR1cm4gdmFsdWUuCisg
ICAgICAgIFdlIG5vdyBhbHNvIHNldCB0aGUgaXRhbGljIGNvcnJlY3Rpb24gd2hlbiBhIGRpc3Bs
YXkgb3BlcmF0b3IgaXMgZm91bmQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVy
YXRvcjo6ZmluZFN0cmV0Y2h5RGF0YSk6IFdlIGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIGludHJv
ZHVjZSBhCisgICAgICAgIHRhcmdldCBzaXplIGFuZCByZW1vdmUgdGhlIHJldHVybiB2YWx1ZS4K
KyAgICAgICAgV2UgYWxzbyByZW1vdmUgdGhlIGNoYXJhY3RlciBwYXJhbWV0ZXIgd2hpY2ggaXMg
YWx3YXlzIG1fdGV4dENvbnRlbnQuCisgICAgICAgIFRoaXMgYWxzbyBkb2VzIHRoZSBlYXJseSBy
ZXR1cm4gd2hlbiB0aGUgYmFzZSBnbHlwaCBpcyBsYXJnZSBlbm91Z2guCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUpOiBXZSB1c2UgdGhlIG5ldyBk
YXRhIG1lbWJlcnMgYW5kIGZ1bmN0aW9uIHNpZ25hdHVyZXMuCisgICAgICAgIFRoZSBjaGVjayBm
b3IgdGhlIGJhc2UgZ2x5cGggc2l6ZSBpcyBub3cgZG9uZSBpbiBmaW5kU3RyZXRjaHlEYXRhLCBz
byB3ZSBqdXN0IGNoZWNrIHdoZXRoZXIKKyAgICAgICAgbV9zdHJldGNoVHlwZSBpcyBVbnN0cmV0
Y2hlZCB0byBkbyBhbiBlYXJseSByZXR1cm4uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6Zmlyc3RMaW5lQmFzZWxpbmUpOiBXZSB1c2UgbV9zdHJldGNoVHlwZS4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpjb21wdXRlTG9naWNhbEhlaWdo
dCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxX
aXRoVmVydGljYWxFeHRlbnNpb25HbHlwaCk6IFVzZSB0aGUgbmV3IGNsYXNzIG1lbWJlcnMuCisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhIb3Jpem9udGFs
RXh0ZW5zaW9uR2x5cGgpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpwYWludCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFzc2VtYmx5KTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jpem9udGFsR2x5cGhBc3NlbWJseSk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50Q2hp
bGRyZW4pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjp0
cmFpbGluZ1NwYWNlRXJyb3IpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjppdGFsaWNDb3JyZWN0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKTogRGVs
ZXRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmg6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXRhbGljQ29ycmVjdGlv
bik6IFdlIGp1c3QgcmV0dXJuIG1faXRhbGljQ29ycmVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpHbHlwaEFzc2VtYmx5RGF0YTo6R2x5cGhBc3NlbWJseURh
dGEpOiBOZXcgY2xhc3MgdG8gc3RvcmUgYW4gYXNzZW1ibHkgb2YgR2x5cGhEYXRhLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6bW9kZSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlE
YXRhOjp2YXJpYW50KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpTdHJldGNoeURhdGE6OnRvcCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpleHRlbnNpb24pOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6Ym90
dG9tKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpT
dHJldGNoeURhdGE6Om1pZGRsZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJN
YXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpsZWZ0KTogRGVsZXRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnJpZ2h0KTogRGVsZXRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6
OnNldE5vcm1hbE1vZGUpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1M
T3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6c2V0U2l6ZVZhcmlhbnRNb2RlKTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnNldEds
eXBoQXNzZW1ibHlNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OlN0cmV0Y2h5RGF0YSk6IERlbGV0ZWQuCisKIDIwMTYt
MDQtMjIgIEZyZWRlcmljIFdhbmcgIDxmcmVkLndhbmdAZnJlZS5mcj4KIAogICAgICAgICBSZW5k
ZXJNYXRoTUxPcGVyYXRvciByZWZhY3RvcmluZzogaW50cm9kdWNlIGdldEJhc2VHbHlwaCBhbmQg
cmVtb3ZlIHBhcmFtZXRlciBmcm9tIGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0
b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVy
YXRvci5jcHAKaW5kZXggYzRhOTRiMC4uOWNkMjE1MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHAKQEAgLTIw
MiwxOCArMjAyLDYgQEAgYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXNDaGlsZEFsbG93ZWQo
Y29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUmVuZGVyU3R5bGUKICAgICByZXR1cm4gZmFsc2U7
CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6Oml0YWxpY0NvcnJlY3Rpb24o
KSBjb25zdAotewotICAgIGlmIChpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKSB7Ci0g
ICAgICAgIGNvbnN0IGF1dG8mIHByaW1hcnlGb250ID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLnBy
aW1hcnlGb250KCk7Ci0gICAgICAgIGlmIChhdXRvKiBtYXRoRGF0YSA9IHByaW1hcnlGb250Lm1h
dGhEYXRhKCkpIHsKLSAgICAgICAgICAgIFN0cmV0Y2h5RGF0YSBsYXJnZU9wZXJhdG9yID0gZ2V0
RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOwotICAgICAgICAgICAgcmV0dXJuIG1hdGhEYXRh
LT5nZXRJdGFsaWNDb3JyZWN0aW9uKHByaW1hcnlGb250LCBsYXJnZU9wZXJhdG9yLnZhcmlhbnQo
KS5nbHlwaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHZvaWQgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OnN0cmV0Y2hUbyhMYXlvdXRVbml0IGhlaWdodEFib3ZlQmFzZWxp
bmUsIExheW91dFVuaXQgZGVwdGhCZWxvd0Jhc2VsaW5lKQogewogICAgIEFTU0VSVChoYXNPcGVy
YXRvckZsYWcoTWF0aE1MT3BlcmF0b3JEaWN0aW9uYXJ5OjpTdHJldGNoeSkpOwpAQCAtMzE3LDEy
ICszMDUsMTIgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZVByZWZlcnJlZExv
Z2ljYWxXaWR0aHMoKQogICAgIH0KICAgICBpZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5
bGUoKSkgewogICAgICAgICAvLyBMYXJnZSBvcGVyYXRvcnMgaW4gU1RJWCBXb3JkIGhhdmUgaW5j
b3JyZWN0IGFkdmFuY2Ugd2lkdGgsIGNhdXNpbmcgbWlzcGxhY2VtZW50IG9mIHN1cGVyc2NyaXB0
LCBzbyB3ZSB1c2UgdGhlIGdseXBoIGJvdW5kIGluc3RlYWQgKGh0dHA6Ly9zb3VyY2Vmb3JnZS5u
ZXQvcC9zdGl4Zm9udHMvdHJhY2tpbmcvNDkvKS4KLSAgICAgICAgU3RyZXRjaHlEYXRhIGxhcmdl
T3BlcmF0b3IgPSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7Ci0gICAgICAgIGlmIChs
YXJnZU9wZXJhdG9yLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpCi0gICAgICAgICAgICBtYXhp
bXVtR2x5cGhXaWR0aCA9IGJvdW5kc0ZvckdseXBoKGxhcmdlT3BlcmF0b3IudmFyaWFudCgpKS53
aWR0aCgpOworICAgICAgICBmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOworICAgICAg
ICBpZiAobV9zdHJldGNoVHlwZSA9PSBTaXplVmFyaWFudCkKKyAgICAgICAgICAgIG1heGltdW1H
bHlwaFdpZHRoID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KS53aWR0aCgpOwogICAgIH0gZWxz
ZSB7CiAgICAgICAgIC8vIEZJWE1FOiBzb21lIGdseXBocyAoZS5nLiB0aGUgb25lIGZvciAiRlJB
Q1RJT04gU0xBU0giIGluIHRoZSBTVElYIE1hdGggZm9udCBvciBsYXJnZSBvcGVyYXRvcnMpIGhh
dmUgYSB3aWR0aCB0aGF0IGRlcGVuZHMgb24gdGhlIGhlaWdodCwgcmVzdWx0aW5nIGluIGxhcmdl
IGdhcHMgKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzAzMjYpLgot
ICAgICAgICBmaW5kU3RyZXRjaHlEYXRhKG1fdGV4dENvbnRlbnQsICZtYXhpbXVtR2x5cGhXaWR0
aCk7CisgICAgICAgIGZpbmRTdHJldGNoeURhdGEoJm1heGltdW1HbHlwaFdpZHRoKTsKICAgICB9
CiAgICAgbV9tYXhQcmVmZXJyZWRMb2dpY2FsV2lkdGggPSBtX21pblByZWZlcnJlZExvZ2ljYWxX
aWR0aCA9IG1fbGVhZGluZ1NwYWNlICsgbWF4aW11bUdseXBoV2lkdGggKyBtX3RyYWlsaW5nU3Bh
Y2U7CiB9CkBAIC0zOTIsMTMgKzM4MCwyMSBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpn
ZXRCYXNlR2x5cGgoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBHbHlwaERhdGEmIGJhcwogICAg
IHJldHVybiBiYXNlR2x5cGguaXNWYWxpZCgpICYmIGJhc2VHbHlwaC5mb250ID09ICZzdHlsZS5m
b250Q2FzY2FkZSgpLnByaW1hcnlGb250KCk7CiB9CiAKLWJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNz
ZW1ibHlQYXJ0PiBhc3NlbWJseVBhcnRzLCBTdHJldGNoeURhdGEmIHN0cmV0Y2h5RGF0YSkgY29u
c3QKK3ZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OnNldFNpemVWYXJpYW50KGNvbnN0IEdseXBo
RGF0YSYgc2l6ZVZhcmlhbnQpCiB7Ci0gICAgR2x5cGhEYXRhIHRvcDsKLSAgICBHbHlwaERhdGEg
ZXh0ZW5zaW9uOwotICAgIEdseXBoRGF0YSBib3R0b207Ci0gICAgR2x5cGhEYXRhIG1pZGRsZTsK
KyAgICBBU1NFUlQoc2l6ZVZhcmlhbnQuaXNWYWxpZCgpICYmIHNpemVWYXJpYW50LmZvbnQtPm1h
dGhEYXRhKCkpOworICAgIG1fc3RyZXRjaFR5cGUgPSBTaXplVmFyaWFudDsKKyAgICBtX3Zhcmlh
bnQgPSBzaXplVmFyaWFudDsKK30KIAordm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c2V0R2x5
cGhBc3NlbWJseShjb25zdCBHbHlwaEFzc2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKQoreworICAg
IG1fc3RyZXRjaFR5cGUgPSBHbHlwaEFzc2VtYmx5OworICAgIG1fYXNzZW1ibHkgPSBhc3NlbWJs
eURhdGE7Cit9CisKK2Jvb2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlG
YWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0PiBhc3NlbWJseVBh
cnRzLCBHbHlwaEFzc2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKSBjb25zdAorewogICAgIC8vIFRo
ZSBzdHJ1Y3R1cmUgb2YgdGhlIE9wZW4gVHlwZSBNYXRoIHRhYmxlIGlzIGEgYml0IG1vcmUgZ2Vu
ZXJhbCB0aGFuIHRoZSBvbmUgY3VycmVudGx5IHVzZWQgYnkgdGhlIFJlbmRlck1hdGhNTE9wZXJh
dG9yIGNvZGUsIHNvIHdlIHRyeSB0byBmYWxsYmFjayBpbiBhIHJlYXNvbmFibGUgd2F5LgogICAg
IC8vIEZJWE1FOiBSZW5kZXJNYXRoTUxPcGVyYXRvciBzaG91bGQgc3VwcG9ydCB0aGUgbW9zdCBn
ZW5lcmFsIGZvcm1hdCAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEz
MDMyNykuCiAgICAgLy8gV2UgdXNlIHRoZSBhcHByb2FjaCBvZiB0aGUgY29weUNvbXBvbmVudHMg
ZnVuY3Rpb24gaW4gZ2l0aHViLmNvbS9tYXRoamF4L01hdGhKYXgtZGV2L2Jsb2IvbWFzdGVyL2Zv
bnRzL09wZW5UeXBlTWF0aC9mb250VXRpbC5weQpAQCAtNDIyLDggKzQxOCw4IEBAIGJvb2wgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5
cGVNYXRoRGF0YTo6QXNzCiAgICAgICAgIE5vbmUKICAgICB9OwogICAgIFBhcnRUeXBlIGV4cGVj
dGVkUGFydFR5cGUgPSBTdGFydDsKLSAgICBleHRlbnNpb24uZ2x5cGggPSAwOwotICAgIG1pZGRs
ZS5nbHlwaCA9IDA7CisgICAgYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaCA9IDA7CisgICAg
YXNzZW1ibHlEYXRhLm1pZGRsZS5nbHlwaCA9IDA7CiAgICAgZm9yIChhdXRvJiBwYXJ0IDogYXNz
ZW1ibHlQYXJ0cykgewogICAgICAgICBpZiAobm9uRXh0ZW5kZXJDb3VudCA8IDMpIHsKICAgICAg
ICAgICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBhdCBtb3N0IHR3byBub24tZXh0ZW5kZXJzIHRoZW4g
d2Ugc2tpcCB0aGUgbWlkZGxlIGdseXBoLgpAQCAtNDMzLDkgKzQyOSw5IEBAIGJvb2wgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVN
YXRoRGF0YTo6QXNzCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYXJ0VHlwZSA9IEVuZDsKICAg
ICAgICAgfQogICAgICAgICBpZiAocGFydC5pc0V4dGVuZGVyKSB7Ci0gICAgICAgICAgICBpZiAo
IWV4dGVuc2lvbi5nbHlwaCkKLSAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2x5cGggPSBwYXJ0
LmdseXBoOyAvLyBXZSBjb3B5IHRoZSBleHRlbmRlciBwYXJ0LgotICAgICAgICAgICAgZWxzZSBp
ZiAoZXh0ZW5zaW9uLmdseXBoICE9IHBhcnQuZ2x5cGgpCisgICAgICAgICAgICBpZiAoIWFzc2Vt
Ymx5RGF0YS5leHRlbnNpb24uZ2x5cGgpCisgICAgICAgICAgICAgICAgYXNzZW1ibHlEYXRhLmV4
dGVuc2lvbi5nbHlwaCA9IHBhcnQuZ2x5cGg7IC8vIFdlIGNvcHkgdGhlIGV4dGVuZGVyIHBhcnQu
CisgICAgICAgICAgICBlbHNlIGlmIChhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoICE9IHBh
cnQuZ2x5cGgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUaGlzIGlzIG5vdCBz
dXBwb3J0ZWQ6IHRoZSBhc3NlbWJseSBoYXMgZGlmZmVyZW50IGV4dGVuZGVycy4KIAogICAgICAg
ICAgICAgc3dpdGNoIChleHBlY3RlZFBhcnRUeXBlKSB7CkBAIC00NjEsMTkgKzQ1NywxOSBAQCBi
b29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9y
PE9wZW5UeXBlTWF0aERhdGE6OkFzcwogICAgICAgICBzd2l0Y2ggKGV4cGVjdGVkUGFydFR5cGUp
IHsKICAgICAgICAgY2FzZSBTdGFydDoKICAgICAgICAgICAgIC8vIFdlIGNvcHkgdGhlIGxlZnQv
Ym90dG9tIHBhcnQuCi0gICAgICAgICAgICBib3R0b20uZ2x5cGggPSBwYXJ0LmdseXBoOworICAg
ICAgICAgICAgYXNzZW1ibHlEYXRhLmJvdHRvbS5nbHlwaCA9IHBhcnQuZ2x5cGg7CiAgICAgICAg
ICAgICBleHBlY3RlZFBhcnRUeXBlID0gRXh0ZW5kZXJCZXR3ZWVuU3RhcnRBbmRNaWRkbGU7CiAg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgY2FzZSBFeHRlbmRlckJldHdlZW5TdGFydEFu
ZE1pZGRsZToKICAgICAgICAgY2FzZSBNaWRkbGU6CiAgICAgICAgICAgICAvLyBXZSBjb3B5IHRo
ZSBtaWRkbGUgcGFydC4KLSAgICAgICAgICAgIG1pZGRsZS5nbHlwaCA9IHBhcnQuZ2x5cGg7Cisg
ICAgICAgICAgICBhc3NlbWJseURhdGEubWlkZGxlLmdseXBoID0gcGFydC5nbHlwaDsKICAgICAg
ICAgICAgIGV4cGVjdGVkUGFydFR5cGUgPSBFeHRlbmRlckJldHdlZW5NaWRkbGVBbmRFbmQ7CiAg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgY2FzZSBFeHRlbmRlckJldHdlZW5NaWRkbGVB
bmRFbmQ6CiAgICAgICAgIGNhc2UgRW5kOgogICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgcmln
aHQvdG9wIHBhcnQuCi0gICAgICAgICAgICB0b3AuZ2x5cGggPSBwYXJ0LmdseXBoOworICAgICAg
ICAgICAgYXNzZW1ibHlEYXRhLnRvcC5nbHlwaCA9IHBhcnQuZ2x5cGg7CiAgICAgICAgICAgICBl
eHBlY3RlZFBhcnRUeXBlID0gTm9uZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBj
YXNlIE5vbmU6CkBAIC00ODIsMzUgKzQ3OCwzMCBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9y
OjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzcwog
ICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFleHRlbnNpb24uZ2x5cGgpCisgICAgaWYgKCFh
c3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoKQogICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRo
aXMgaXMgbm90IHN1cHBvcnRlZDogd2UgYWx3YXlzIGFzc3VtZSB0aGF0IHdlIGhhdmUgYW4gZXh0
ZW5zaW9uIGdseXBoLgogCiAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0b3AvYm90dG9tIGdseXBo
cywgd2UgdXNlIHRoZSBleHRlbnNpb24gZ2x5cGguCi0gICAgaWYgKCF0b3AuZ2x5cGgpCi0gICAg
ICAgIHRvcC5nbHlwaCA9IGV4dGVuc2lvbi5nbHlwaDsKLSAgICBpZiAoIWJvdHRvbS5nbHlwaCkK
LSAgICAgICAgYm90dG9tLmdseXBoID0gZXh0ZW5zaW9uLmdseXBoOworICAgIGlmICghYXNzZW1i
bHlEYXRhLnRvcC5nbHlwaCkKKyAgICAgICAgYXNzZW1ibHlEYXRhLnRvcC5nbHlwaCA9IGFzc2Vt
Ymx5RGF0YS5leHRlbnNpb24uZ2x5cGg7CisgICAgaWYgKCFhc3NlbWJseURhdGEuYm90dG9tLmds
eXBoKQorICAgICAgICBhc3NlbWJseURhdGEuYm90dG9tLmdseXBoID0gYXNzZW1ibHlEYXRhLmV4
dGVuc2lvbi5nbHlwaDsKIAotICAgIHRvcC5mb250ID0gJnN0eWxlKCkuZm9udENhc2NhZGUoKS5w
cmltYXJ5Rm9udCgpOwotICAgIGV4dGVuc2lvbi5mb250ID0gdG9wLmZvbnQ7Ci0gICAgYm90dG9t
LmZvbnQgPSB0b3AuZm9udDsKLSAgICBpZiAobWlkZGxlLmdseXBoKQotICAgICAgICBtaWRkbGUu
Zm9udCA9IHRvcC5mb250OwotCi0gICAgc3RyZXRjaHlEYXRhLnNldEdseXBoQXNzZW1ibHlNb2Rl
KHRvcCwgZXh0ZW5zaW9uLCBib3R0b20sIG1pZGRsZSk7CisgICAgYXNzZW1ibHlEYXRhLnRvcC5m
b250ID0gJnN0eWxlKCkuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgpOworICAgIGFzc2VtYmx5
RGF0YS5leHRlbnNpb24uZm9udCA9IGFzc2VtYmx5RGF0YS50b3AuZm9udDsKKyAgICBhc3NlbWJs
eURhdGEuYm90dG9tLmZvbnQgPSBhc3NlbWJseURhdGEudG9wLmZvbnQ7CisgICAgYXNzZW1ibHlE
YXRhLm1pZGRsZS5mb250ID0gYXNzZW1ibHlEYXRhLm1pZGRsZS5nbHlwaCA/IGFzc2VtYmx5RGF0
YS50b3AuZm9udCA6IG51bGxwdHI7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotUmVuZGVyTWF0
aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0RGlzcGxh
eVN0eWxlTGFyZ2VPcGVyYXRvcigpIGNvbnN0Cit2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpm
aW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpCiB7Ci0gICAgU3RyZXRjaHlEYXRhIGRhdGE7
Ci0KICAgICBBU1NFUlQobV9pc1ZlcnRpY2FsICYmIGlzTGFyZ2VPcGVyYXRvckluRGlzcGxheVN0
eWxlKCkpOwogCiAgICAgR2x5cGhEYXRhIGJhc2VHbHlwaDsKICAgICBpZiAoIWdldEJhc2VHbHlw
aChzdHlsZSgpLCBiYXNlR2x5cGgpIHx8ICFiYXNlR2x5cGguZm9udC0+bWF0aERhdGEoKSkKLSAg
ICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJldHVybjsKIAogICAgIFZlY3RvcjxHbHlwaD4g
c2l6ZVZhcmlhbnRzOwogICAgIFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+
IGFzc2VtYmx5UGFydHM7CkBAIC01MjEsNTkgKzUxMiw2MCBAQCBSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6U3RyZXRjaHlEYXRhIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXREaXNwbGF5U3R5bGVMYXJn
ZU9wZQogICAgIGJhc2VHbHlwaC5mb250LT5tYXRoRGF0YSgpLT5nZXRNYXRoVmFyaWFudHMoYmFz
ZUdseXBoLmdseXBoLCB0cnVlLCBzaXplVmFyaWFudHMsIGFzc2VtYmx5UGFydHMpOwogCiAgICAg
Ly8gV2UgY2hvb3NlIHRoZSBmaXJzdCBzaXplIHZhcmlhbnQgdGhhdCBpcyBsYXJnZXIgdGhhbiB0
aGUgZXhwZWN0ZWQgZGlzcGxheU9wZXJhdG9yTWluSGVpZ2h0IGFuZCBvdGhlcndpc2UgZmFsbGJh
Y2sgdG8gdGhlIGxhcmdlc3QgdmFyaWFudC4KLSAgICBmb3IgKGF1dG8mIHZhcmlhbnQgOiBzaXpl
VmFyaWFudHMpIHsKLSAgICAgICAgR2x5cGhEYXRhIHNpemVWYXJpYW50OwotICAgICAgICBzaXpl
VmFyaWFudC5nbHlwaCA9IHZhcmlhbnQ7Ci0gICAgICAgIHNpemVWYXJpYW50LmZvbnQgPSBiYXNl
R2x5cGguZm9udDsKLSAgICAgICAgZGF0YS5zZXRTaXplVmFyaWFudE1vZGUoc2l6ZVZhcmlhbnQp
OwotICAgICAgICBpZiAoYm91bmRzRm9yR2x5cGgoc2l6ZVZhcmlhbnQpLmhlaWdodCgpID49IGRp
c3BsYXlPcGVyYXRvck1pbkhlaWdodCkKLSAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgIGZv
ciAoYXV0byYgc2l6ZVZhcmlhbnQgOiBzaXplVmFyaWFudHMpIHsKKyAgICAgICAgR2x5cGhEYXRh
IGdseXBoRGF0YShzaXplVmFyaWFudCwgYmFzZUdseXBoLmZvbnQpOworICAgICAgICBzZXRTaXpl
VmFyaWFudChnbHlwaERhdGEpOworICAgICAgICBtX2l0YWxpY0NvcnJlY3Rpb24gPSBnbHlwaERh
dGEuZm9udC0+bWF0aERhdGEoKS0+Z2V0SXRhbGljQ29ycmVjdGlvbigqZ2x5cGhEYXRhLmZvbnQs
IGdseXBoRGF0YS5nbHlwaCk7CisgICAgICAgIGlmIChoZWlnaHRGb3JHbHlwaChnbHlwaERhdGEp
ID49IGRpc3BsYXlPcGVyYXRvck1pbkhlaWdodCkKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0K
LSAgICByZXR1cm4gZGF0YTsKIH0KIAotUmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0
YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmluZFN0cmV0Y2h5RGF0YShVQ2hhciBjaGFyYWN0ZXIs
IGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0aCkKK3ZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZp
bmRTdHJldGNoeURhdGEoZmxvYXQqIG1heGltdW1HbHlwaFdpZHRoLCBMYXlvdXRVbml0IHRhcmdl
dFNpemUpCiB7CiAgICAgQVNTRVJUKCFtYXhpbXVtR2x5cGhXaWR0aCB8fCBtX2lzVmVydGljYWwp
OwogCi0gICAgU3RyZXRjaHlEYXRhIGRhdGE7Ci0gICAgU3RyZXRjaHlEYXRhIGFzc2VtYmx5RGF0
YTsKLQogICAgIEdseXBoRGF0YSBiYXNlR2x5cGg7CiAgICAgaWYgKCFnZXRCYXNlR2x5cGgoc3R5
bGUoKSwgYmFzZUdseXBoKSkKLSAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJldHVybjsK
ICAgICAKKyAgICBpZiAoIW1heGltdW1HbHlwaFdpZHRoKSB7CisgICAgICAgIC8vIFdlIGRvIG5v
dCBzdHJldGNoIGlmIHRoZSBiYXNlIGdseXBoIGlzIGxhcmdlIGVub3VnaC4KKyAgICAgICAgZmxv
YXQgYmFzZVNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRGb3JHbHlwaChiYXNlR2x5cGgpIDog
YWR2YW5jZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBoKTsKKyAgICAgICAgaWYgKHRhcmdldFNpemUg
PD0gYmFzZVNpemUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgR2x5cGhBc3Nl
bWJseURhdGEgYXNzZW1ibHlEYXRhOwogICAgIGlmIChiYXNlR2x5cGguZm9udC0+bWF0aERhdGEo
KSkgewogICAgICAgICBWZWN0b3I8R2x5cGg+IHNpemVWYXJpYW50czsKICAgICAgICAgVmVjdG9y
PE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4gYXNzZW1ibHlQYXJ0czsKICAgICAgICAg
YmFzZUdseXBoLmZvbnQtPm1hdGhEYXRhKCktPmdldE1hdGhWYXJpYW50cyhiYXNlR2x5cGguZ2x5
cGgsIG1faXNWZXJ0aWNhbCwgc2l6ZVZhcmlhbnRzLCBhc3NlbWJseVBhcnRzKTsKICAgICAgICAg
Ly8gV2UgdmVyaWZ5IHRoZSBzaXplIHZhcmlhbnRzLgotICAgICAgICBmb3IgKGF1dG8mIHZhcmlh
bnQgOiBzaXplVmFyaWFudHMpIHsKLSAgICAgICAgICAgIEdseXBoRGF0YSBzaXplVmFyaWFudDsK
LSAgICAgICAgICAgIHNpemVWYXJpYW50LmdseXBoID0gdmFyaWFudDsKLSAgICAgICAgICAgIHNp
emVWYXJpYW50LmZvbnQgPSBiYXNlR2x5cGguZm9udDsKKyAgICAgICAgZm9yIChhdXRvJiBzaXpl
VmFyaWFudCA6IHNpemVWYXJpYW50cykgeworICAgICAgICAgICAgR2x5cGhEYXRhIGdseXBoRGF0
YShzaXplVmFyaWFudCwgYmFzZUdseXBoLmZvbnQpOwogICAgICAgICAgICAgaWYgKG1heGltdW1H
bHlwaFdpZHRoKQotICAgICAgICAgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4
KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoc2l6ZVZhcmlhbnQpKTsK
KyAgICAgICAgICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUds
eXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGdseXBoRGF0YSkpOwogICAgICAgICAgICAg
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXRTaXplVmFyaWFudE1vZGUoc2l6ZVZhcmlh
bnQpOwotICAgICAgICAgICAgICAgIGZsb2F0IHNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRG
b3JHbHlwaChzaXplVmFyaWFudCkgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChzaXplVmFyaWFudCk7
Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gc3RyZXRjaFNpemUoKSkgCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIHNldFNpemVWYXJpYW50KGds
eXBoRGF0YSk7CisgICAgICAgICAgICAgICAgZmxvYXQgc2l6ZSA9IG1faXNWZXJ0aWNhbCA/IGhl
aWdodEZvckdseXBoKGdseXBoRGF0YSkgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChnbHlwaERhdGEp
OworICAgICAgICAgICAgICAgIGlmIChzaXplID49IHRhcmdldFNpemUpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFdl
IHZlcmlmeSBpZiB0aGVyZSBpcyBhIGNvbnN0cnVjdGlvbi4KICAgICAgICAgaWYgKCFnZXRHbHlw
aEFzc2VtYmx5RmFsbEJhY2soYXNzZW1ibHlQYXJ0cywgYXNzZW1ibHlEYXRhKSkKLSAgICAgICAg
ICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAg
ICAgIGlmICghbV9pc1ZlcnRpY2FsKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAg
ICAgICByZXR1cm47CiAKICAgICAgICAgLy8gSWYgdGhlIGZvbnQgZG9lcyBub3QgaGF2ZSBhIE1B
VEggdGFibGUsIHdlIGZhbGxiYWNrIHRvIHRoZSBVbmljb2RlLW9ubHkgY29uc3RydWN0aW9ucy4K
ICAgICAgICAgY29uc3QgU3RyZXRjaHlDaGFyYWN0ZXIqIHN0cmV0Y2h5Q2hhcmFjdGVyID0gbnVs
bHB0cjsKICAgICAgICAgY29uc3QgdW5zaWduZWQgbWF4SW5kZXggPSBXVEZfQVJSQVlfTEVOR1RI
KHN0cmV0Y2h5Q2hhcmFjdGVycyk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaW5kZXggPSAwOyBp
bmRleCA8IG1heEluZGV4OyArK2luZGV4KSB7Ci0gICAgICAgICAgICBpZiAoc3RyZXRjaHlDaGFy
YWN0ZXJzW2luZGV4XS5jaGFyYWN0ZXIgPT0gY2hhcmFjdGVyKSB7CisgICAgICAgICAgICBpZiAo
c3RyZXRjaHlDaGFyYWN0ZXJzW2luZGV4XS5jaGFyYWN0ZXIgPT0gbV90ZXh0Q29udGVudCkgewog
ICAgICAgICAgICAgICAgIHN0cmV0Y2h5Q2hhcmFjdGVyID0gJnN0cmV0Y2h5Q2hhcmFjdGVyc1tp
bmRleF07CiAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSAmJiBpbmRleCA8IGxlZnRSaWdodFBhaXJzQ291bnQgKiAyKSB7CiAgICAgICAgICAgICAg
ICAgICAgIC8vIElmIHdlIGFyZSBpbiByaWdodC10by1sZWZ0IGRpcmVjdGlvbiB3ZSBzZWxlY3Qg
dGhlIG1pcnJvcmVkIGZvcm0gYnkgYWRkaW5nIC0xIG9yICsxIGFjY29yZGluZyB0byB0aGUgcGFy
aXR5IG9mIGluZGV4LgpAQCAtNTg1LDQ1ICs1NzcsMzIgQEAgUmVuZGVyTWF0aE1MT3BlcmF0b3I6
OlN0cmV0Y2h5RGF0YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmluZFN0cmV0Y2h5RGF0YShVQ2hh
cgogCiAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgc3RyZXRjaHkgY2hhcmFjdGVyIHNl
dCBmb3IgdGhpcyBjaGFyYWN0ZXIsIHdlIGRvbid0IGtub3cgaG93IHRvIHN0cmV0Y2ggaXQuCiAg
ICAgICAgIGlmICghc3RyZXRjaHlDaGFyYWN0ZXIpCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsK
KyAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICAvLyBXZSBjb252ZXJ0IHRoZSBsaXN0IG9m
IFVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIGEgbGlzdCBvZiBnbHlwaCBkYXRhLgotICAgICAgICBH
bHlwaERhdGEgdG9wID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3Rl
cihzdHJldGNoeUNoYXJhY3Rlci0+dG9wQ2hhciwgZmFsc2UpOwotICAgICAgICBHbHlwaERhdGEg
ZXh0ZW5zaW9uID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3Rlcihz
dHJldGNoeUNoYXJhY3Rlci0+ZXh0ZW5zaW9uQ2hhciwgZmFsc2UpOwotICAgICAgICBHbHlwaERh
dGEgYm90dG9tID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3Rlcihz
dHJldGNoeUNoYXJhY3Rlci0+Ym90dG9tQ2hhciwgZmFsc2UpOwotICAgICAgICBHbHlwaERhdGEg
bWlkZGxlOwotICAgICAgICBpZiAoc3RyZXRjaHlDaGFyYWN0ZXItPm1pZGRsZUNoYXIpCi0gICAg
ICAgICAgICBtaWRkbGUgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFyLCBmYWxzZSk7Ci0gICAgICAgIGFzc2Vt
Ymx5RGF0YS5zZXRHbHlwaEFzc2VtYmx5TW9kZSh0b3AsIGV4dGVuc2lvbiwgYm90dG9tLCBtaWRk
bGUpOworICAgICAgICBhc3NlbWJseURhdGEudG9wID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmds
eXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNoYXJhY3Rlci0+dG9wQ2hhciwgZmFsc2UpOwor
ICAgICAgICBhc3NlbWJseURhdGEuZXh0ZW5zaW9uID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmds
eXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNoYXJhY3Rlci0+ZXh0ZW5zaW9uQ2hhciwgZmFs
c2UpOworICAgICAgICBhc3NlbWJseURhdGEuYm90dG9tID0gc3R5bGUoKS5mb250Q2FzY2FkZSgp
LmdseXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNoYXJhY3Rlci0+Ym90dG9tQ2hhciwgZmFs
c2UpOworICAgICAgICBhc3NlbWJseURhdGEubWlkZGxlID0gc3RyZXRjaHlDaGFyYWN0ZXItPm1p
ZGRsZUNoYXIgPyBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0
cmV0Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFyLCBmYWxzZSkgOiBHbHlwaERhdGEoKTsKICAgICB9
CiAKLSAgICBBU1NFUlQoYXNzZW1ibHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7
Ci0KICAgICAvLyBJZiB3ZSBhcmUgbWVhc3VyaW5nIHRoZSBtYXhpbXVtIHdpZHRoLCB2ZXJpZnkg
ZWFjaCBjb21wb25lbnQuCiAgICAgaWYgKG1heGltdW1HbHlwaFdpZHRoKSB7Ci0gICAgICAgICpt
YXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLnRvcCgpKSk7Ci0gICAgICAgICptYXhpbXVtR2x5cGhX
aWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgo
YXNzZW1ibHlEYXRhLmV4dGVuc2lvbigpKSk7Ci0gICAgICAgIGlmIChhc3NlbWJseURhdGEubWlk
ZGxlKCkuZ2x5cGgpCi0gICAgICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgq
bWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRk
bGUoKSkpOwotICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUds
eXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5ib3R0b20oKSkpOwot
ICAgICAgICByZXR1cm4gYXNzZW1ibHlEYXRhOworICAgICAgICAqbWF4aW11bUdseXBoV2lkdGgg
PSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2Vt
Ymx5RGF0YS50b3ApKTsKKyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1h
eGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEuZXh0ZW5z
aW9uKSk7CisgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5
cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSkpOworICAg
ICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFk
dmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5ib3R0b20pKTsKKyAgICAgICAgcmV0dXJu
OwogICAgIH0KIAogICAgIC8vIFdlIGVuc3VyZSB0aGF0IHRoZSBzaXplIGlzIGxhcmdlIGVub3Vn
aCB0byBhdm9pZCBnbHlwaCBvdmVybGFwcy4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChtX2lz
VmVydGljYWwpIHsKLSAgICAgICAgc2l6ZSA9IGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS50
b3AoKSkgKyBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEuYm90dG9tKCkpOwotICAgICAgICBp
ZiAoYXNzZW1ibHlEYXRhLm1pZGRsZSgpLmdseXBoKQotICAgICAgICAgICAgc2l6ZSArPSBoZWln
aHRGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IHNpemUgPSBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubGVmdCgpKSArIGFkdmFu
Y2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5yaWdodCgpKTsKLSAgICAgICAgaWYgKGFzc2Vt
Ymx5RGF0YS5taWRkbGUoKS5nbHlwaCkKLSAgICAgICAgICAgIHNpemUgKz0gYWR2YW5jZVdpZHRo
Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSgpKTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPiBz
dHJldGNoU2l6ZSgpKQotICAgICAgICByZXR1cm4gZGF0YTsKKyAgICBmbG9hdCBtaW5TaXplID0g
bV9pc1ZlcnRpY2FsID8KKyAgICAgICAgaGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLnRvcCkg
KyBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKSArIGhlaWdodEZvckdseXBoKGFz
c2VtYmx5RGF0YS5ib3R0b20pCisgICAgICAgIDogYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1i
bHlEYXRhLmxlZnQpICsgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSkg
KyBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEucmlnaHQpOworICAgIGlmIChtaW5T
aXplID4gdGFyZ2V0U2l6ZSkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgcmV0dXJuIGFzc2VtYmx5
RGF0YTsKKyAgICBzZXRHbHlwaEFzc2VtYmx5KGFzc2VtYmx5RGF0YSk7CiB9CiAKIHZvaWQgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OnVwZGF0ZVN0eWxlKCkKQEAgLTYzMiw3ICs2MTEsOCBAQCB2b2lk
IFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgaWYgKCFmaXJzdENoaWxk
KCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fc3RyZXRjaHlEYXRhLnNldE5vcm1hbE1vZGUo
KTsKKyAgICBtX3N0cmV0Y2hUeXBlID0gVW5zdHJldGNoZWQ7CisgICAgbV9pdGFsaWNDb3JyZWN0
aW9uID0gMDsKICAgICAvLyBXZSBhZGQgc3BhY2luZyBhcm91bmQgdGhlIG9wZXJhdG9yLgogICAg
IC8vIEZJWE1FOiBUaGUgc3BhY2luZyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHdob2xlIGVtYmVs
bGlzaGVkIG9wZXJhdG9yIChodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTI0ODMxKS4KICAgICAvLyBGSVhNRTogVGhlIHNwYWNpbmcgc2hvdWxkIG9ubHkgYmUgYWRkZWQg
aW5zaWRlIChwZXJoYXBzIGluZmVycmVkKSBtcm93IChodHRwOi8vd3d3LnczLm9yZy9UUi9NYXRo
TUwvY2hhcHRlcjMuaHRtbCNwcmVzbS5vcHNwYWNpbmcpLgpAQCAtNjQ3LDI3ICs2MjcsMjQgQEAg
dm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUoKQogICAgICAgICByZXR1cm47
CiAKICAgICBpZiAobV9pc1ZlcnRpY2FsICYmIGlzTGFyZ2VPcGVyYXRvckluRGlzcGxheVN0eWxl
KCkpCi0gICAgICAgIG1fc3RyZXRjaHlEYXRhID0gZ2V0RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRv
cigpOworICAgICAgICBmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOwogICAgIGVsc2Ug
ewotICAgICAgICAvLyBXZSBkbyBub3Qgc3RyZXRjaCBpZiB0aGUgYmFzZSBnbHlwaCBpcyBsYXJn
ZSBlbm91Z2guCi0gICAgICAgIEdseXBoRGF0YSBiYXNlR2x5cGggPSBzdHlsZSgpLmZvbnRDYXNj
YWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1fdGV4dENvbnRlbnQsICFzdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSk7Ci0gICAgICAgIGZsb2F0IGJhc2VTaXplID0gbV9pc1ZlcnRp
Y2FsID8gaGVpZ2h0Rm9yR2x5cGgoYmFzZUdseXBoKSA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGJh
c2VHbHlwaCk7Ci0gICAgICAgIGlmIChzdHJldGNoU2l6ZSgpIDw9IGJhc2VTaXplKQorICAgICAg
ICBmaW5kU3RyZXRjaHlEYXRhKG51bGxwdHIsIHN0cmV0Y2hTaXplKCkpOworICAgICAgICBpZiAo
bV9zdHJldGNoVHlwZSA9PSBVbnN0cmV0Y2hlZCkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgbV9zdHJldGNoeURhdGEgPSBmaW5kU3RyZXRjaHlEYXRhKG1fdGV4dENvbnRlbnQsIG51bGxw
dHIpOwogICAgIH0KIAotICAgIGlmIChtX2lzVmVydGljYWwgJiYgbV9zdHJldGNoeURhdGEubW9k
ZSgpID09IERyYXdTaXplVmFyaWFudCkgeworICAgIGlmIChtX2lzVmVydGljYWwgJiYgbV9zdHJl
dGNoVHlwZSA9PSBTaXplVmFyaWFudCkgewogICAgICAgICAvLyBXZSByZXNpemUgdGhlIG9wZXJh
dG9yIHRvIG1hdGNoIHRoZSBvbmUgb2YgdGhlIHNpemUgdmFyaWFudC4KICAgICAgICAgaWYgKGlz
TGFyZ2VPcGVyYXRvckluRGlzcGxheVN0eWxlKCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzdHJl
dGNoIHNpemUgaXMgYWN0dWFsbHkgbm90IGludm9sdmVkIGluIHRoZSBzZWxlY3Rpb24gb2YgdGhl
IHNpemUgdmFyaWFudCBpbiBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yLgorICAgICAgICAg
ICAgLy8gVGhlIHN0cmV0Y2ggc2l6ZSBpcyBhY3R1YWxseSBub3QgaW52b2x2ZWQgaW4gdGhlIHNl
bGVjdGlvbiBvZiB0aGUgc2l6ZSB2YXJpYW50IGluIGZpbmREaXNwbGF5U3R5bGVMYXJnZU9wZXJh
dG9yLgogICAgICAgICAgICAgLy8gV2Ugc2ltcGx5IHVzZSB0aGUgaGVpZ2h0IGFuZCBkZXB0aCBv
ZiB0aGUgc2VsZWN0ZWQgc2l6ZSB2YXJpYW50IGdseXBoLgotICAgICAgICAgICAgRmxvYXRSZWN0
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgpKTsK
KyAgICAgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fdmFy
aWFudCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gLWdseXBo
Qm91bmRzLnkoKTsKICAgICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IGds
eXBoQm91bmRzLm1heFkoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIHJl
c2NhbGUgdGhlIGhlaWdodCBhbmQgZGVwdGggcHJvcG9ydGlvbmF0ZWx5LgotICAgICAgICAgICAg
ZmxvYXQgdmFyaWFudFNpemUgPSBoZWlnaHRGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50
KCkpOworICAgICAgICAgICAgZmxvYXQgdmFyaWFudFNpemUgPSBoZWlnaHRGb3JHbHlwaChtX3Zh
cmlhbnQpOwogICAgICAgICAgICAgZmxvYXQgc2l6ZSA9IHN0cmV0Y2hTaXplKCk7CiAgICAgICAg
ICAgICBmbG9hdCBhc3BlY3QgPSBzaXplID4gMCA/IHZhcmlhbnRTaXplIC8gc2l6ZSA6IDEuMDsK
ICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgKj0gYXNwZWN0OwpAQCAt
Njc2LDMwICs2NTMsMzAgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUo
KQogICAgIH0KIAogICAgIGlmICghbV9pc1ZlcnRpY2FsKSB7Ci0gICAgICAgIGlmIChtX3N0cmV0
Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1NpemVWYXJpYW50KSB7Ci0gICAgICAgICAgICBGbG9hdFJl
Y3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkp
OworICAgICAgICBpZiAobV9zdHJldGNoVHlwZSA9PSBTaXplVmFyaWFudCkgeworICAgICAgICAg
ICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KTsKICAg
ICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSAtZ2x5cGhCb3VuZHMueSgp
OwogICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0gZ2x5cGhCb3VuZHMu
bWF4WSgpOwotICAgICAgICAgICAgbV9zdHJldGNoV2lkdGggPSBhZHZhbmNlV2lkdGhGb3JHbHlw
aChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1fc3RyZXRj
aHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSkgeworICAgICAgICAgICAgbV9zdHJl
dGNoV2lkdGggPSBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX3ZhcmlhbnQpOworICAgICAgICB9IGVs
c2UgaWYgKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSkgewogICAgICAgICAgICAgRmxv
YXRSZWN0IGdseXBoQm91bmRzOwogICAgICAgICAgICAgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNl
bGluZSA9IDA7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSAwOwog
Ci0gICAgICAgICAgICBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRh
LmxlZnQoKSk7CisgICAgICAgICAgICBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNz
ZW1ibHkubGVmdCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0g
c3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBo
Qm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBz
dGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91
bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgo
bV9zdHJldGNoeURhdGEucmlnaHQoKSk7CisgICAgICAgICAgICBnbHlwaEJvdW5kcyA9IGJvdW5k
c0ZvckdseXBoKG1fYXNzZW1ibHkucmlnaHQpOwogICAgICAgICAgICAgbV9zdHJldGNoSGVpZ2h0
QWJvdmVCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+KG1fc3RyZXRjaEhlaWdodEFib3Zl
QmFzZWxpbmUsIC1nbHlwaEJvdW5kcy55KCkpOwogICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhC
ZWxvd0Jhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoRGVwdGhCZWxvd0Jh
c2VsaW5lLCBnbHlwaEJvdW5kcy5tYXhZKCkpOwogCi0gICAgICAgICAgICBnbHlwaEJvdW5kcyA9
IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpKTsKKyAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5leHRlbnNpb24pOwogICAg
ICAgICAgICAgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91dFVu
aXQ+KG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUsIC1nbHlwaEJvdW5kcy55KCkpOwogICAg
ICAgICAgICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5p
dD4obV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lLCBnbHlwaEJvdW5kcy5tYXhZKCkpOwogCi0g
ICAgICAgICAgICBpZiAobV9zdHJldGNoeURhdGEubWlkZGxlKCkuZ2x5cGgpIHsKLSAgICAgICAg
ICAgICAgICBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLm1pZGRs
ZSgpKTsKKyAgICAgICAgICAgIGlmIChtX2Fzc2VtYmx5Lm1pZGRsZS5pc1ZhbGlkKCkpIHsKKyAg
ICAgICAgICAgICAgICBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNzZW1ibHkubWlk
ZGxlKTsKICAgICAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gc3Rk
OjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBoQm91
bmRzLnkoKSk7CiAgICAgICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0g
c3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lLCBnbHlwaEJv
dW5kcy5tYXhZKCkpOwogICAgICAgICAgICAgfQpAQCAtNzA5LDE0ICs2ODYsMTQgQEAgdm9pZCBS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUoKQogCiBPcHRpb25hbDxpbnQ+IFJlbmRl
ck1hdGhNTE9wZXJhdG9yOjpmaXJzdExpbmVCYXNlbGluZSgpIGNvbnN0CiB7Ci0gICAgaWYgKG1f
c3RyZXRjaHlEYXRhLm1vZGUoKSAhPSBEcmF3Tm9ybWFsKQorICAgIGlmIChtX3N0cmV0Y2hUeXBl
ICE9IFVuc3RyZXRjaGVkKQogICAgICAgICByZXR1cm4gT3B0aW9uYWw8aW50PihtX3N0cmV0Y2hI
ZWlnaHRBYm92ZUJhc2VsaW5lKTsKICAgICByZXR1cm4gUmVuZGVyTWF0aE1MVG9rZW46OmZpcnN0
TGluZUJhc2VsaW5lKCk7CiB9CiAKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmNvbXB1dGVM
b2dpY2FsSGVpZ2h0KExheW91dFVuaXQgbG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wLCBMb2dpY2FsRXh0ZW50Q29tcHV0ZWRWYWx1ZXMmIGNvbXB1dGVkVmFsdWVzKSBjb25zdAog
ewotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgIT0gRHJhd05vcm1hbCkKKyAgICBpZiAo
bV9zdHJldGNoVHlwZSAhPSBVbnN0cmV0Y2hlZCkKICAgICAgICAgbG9naWNhbEhlaWdodCA9IG1f
c3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgKyBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmU7
CiAgICAgUmVuZGVyQm94Ojpjb21wdXRlTG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0LCBsb2dp
Y2FsVG9wLCBjb21wdXRlZFZhbHVlcyk7CiB9CkBAIC03NzYsOCArNzUzLDggQEAgTGF5b3V0UmVj
dCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRHbHlwaChQYWludEluZm8mIGluZm8sIGNvbnN0
IEdseXBoRGF0YSYgZGEKIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoVmVydGlj
YWxFeHRlbnNpb25HbHlwaChQYWludEluZm8mIGluZm8sIGNvbnN0IExheW91dFBvaW50JiBmcm9t
LCBjb25zdCBMYXlvdXRQb2ludCYgdG8pCiB7CiAgICAgQVNTRVJUKG1faXNWZXJ0aWNhbCk7Ci0g
ICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7Ci0g
ICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpLmdseXBoKTsKKyAgICBBU1NFUlQo
bV9zdHJldGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KTsKKyAgICBBU1NFUlQobV9hc3NlbWJseS5l
eHRlbnNpb24uaXNWYWxpZCgpKTsKICAgICBBU1NFUlQoZnJvbS55KCkgPD0gdG8ueSgpKTsKIAog
ICAgIC8vIElmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgZXh0ZW5zaW9uIGdseXBoLCB3ZSBk
b24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgpAQCAtNzg2LDcgKzc2Myw3IEBAIHZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoVmVydGljYWxFeHRlbnNpb25HbHlwaChQYWludEluZm8m
IGluZm8sIGNvbnN0CiAKICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
aW5mby5jb250ZXh0KCkpOwogCi0gICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9y
R2x5cGgobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCkpOworICAgIEZsb2F0UmVjdCBnbHlwaEJv
dW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNzZW1ibHkuZXh0ZW5zaW9uKTsKIAogICAgIC8vIENs
aXBwaW5nIHRoZSBleHRlbmRlciByZWdpb24gaGVyZSBhbGxvd3MgdXMgdG8gZHJhdyB0aGUgYm90
dG9tIGV4dGVuZGVyIGdseXBoIGludG8gdGhlCiAgICAgLy8gcmVnaW9ucyBvZiB0aGUgYm90dG9t
IGdseXBoIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgb3ZlcmRyYXcgKGhhaXJ5IHBpeGVscykgYW5k
IHNpbXBsaWZpZXMgbGF0ZXIgY2xpcHBpbmcuCkBAIC04MDEsNyArNzc4LDcgQEAgdm9pZCBSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5m
byYgaW5mbywgY29uc3QKICAgICBGbG9hdFJlY3QgbGFzdFBhaW50ZWRHbHlwaFJlY3QoZnJvbSwg
RmxvYXRTaXplKCkpOwogCiAgICAgd2hpbGUgKGxhc3RQYWludGVkR2x5cGhSZWN0Lm1heFkoKSA8
IHRvLnkoKSkgewotICAgICAgICBsYXN0UGFpbnRlZEdseXBoUmVjdCA9IHBhaW50R2x5cGgoaW5m
bywgbV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCksIGdseXBoT3JpZ2luLCBUcmltVG9wQW5kQm90
dG9tKTsKKyAgICAgICAgbGFzdFBhaW50ZWRHbHlwaFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1f
YXNzZW1ibHkuZXh0ZW5zaW9uLCBnbHlwaE9yaWdpbiwgVHJpbVRvcEFuZEJvdHRvbSk7CiAgICAg
ICAgIGdseXBoT3JpZ2luLnNldFkoZ2x5cGhPcmlnaW4ueSgpICsgbGFzdFBhaW50ZWRHbHlwaFJl
Y3QuaGVpZ2h0KCkpOwogCiAgICAgICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBpZiB0aGUg
Zm9udCBzaXplIGlzIHNtYWxsIGVub3VnaCB0aGUgZ2x1ZSBnbHlwaCBoYXMgYmVlbiByZWR1Y2Vk
IHRvIGFuIGVtcHR5IHJlY3RhbmdsZQpAQCAtODE0LDggKzc5MSw4IEBAIHZvaWQgUmVuZGVyTWF0
aE1MT3BlcmF0b3I6OmZpbGxXaXRoVmVydGljYWxFeHRlbnNpb25HbHlwaChQYWludEluZm8mIGlu
Zm8sIGNvbnN0CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aEhvcml6b250YWxF
eHRlbnNpb25HbHlwaChQYWludEluZm8mIGluZm8sIGNvbnN0IExheW91dFBvaW50JiBmcm9tLCBj
b25zdCBMYXlvdXRQb2ludCYgdG8pCiB7CiAgICAgQVNTRVJUKCFtX2lzVmVydGljYWwpOwotICAg
IEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotICAg
IEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5leHRlbnNpb24oKS5nbHlwaCk7CisgICAgQVNTRVJUKG1f
c3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkuZXh0
ZW5zaW9uLmlzVmFsaWQoKSk7CiAgICAgQVNTRVJUKGZyb20ueCgpIDw9IHRvLngoKSk7CiAKICAg
ICAvLyBJZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIGV4dGVuc2lvbiBnbHlwaCwgd2UgZG9u
J3QgbmVlZCB0byBkbyBhbnl0aGluZy4KQEAgLTgzNyw3ICs4MTQsNyBAQCB2b2lkIFJlbmRlck1h
dGhNTE9wZXJhdG9yOjpmaWxsV2l0aEhvcml6b250YWxFeHRlbnNpb25HbHlwaChQYWludEluZm8m
IGluZm8sIGNvbgogICAgIEZsb2F0UmVjdCBsYXN0UGFpbnRlZEdseXBoUmVjdChmcm9tLCBGbG9h
dFNpemUoKSk7CiAKICAgICB3aGlsZSAobGFzdFBhaW50ZWRHbHlwaFJlY3QubWF4WCgpIDwgdG8u
eCgpKSB7Ci0gICAgICAgIGxhc3RQYWludGVkR2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBt
X3N0cmV0Y2h5RGF0YS5leHRlbnNpb24oKSwgZ2x5cGhPcmlnaW4sIFRyaW1MZWZ0QW5kUmlnaHQp
OworICAgICAgICBsYXN0UGFpbnRlZEdseXBoUmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3Nl
bWJseS5leHRlbnNpb24sIGdseXBoT3JpZ2luLCBUcmltTGVmdEFuZFJpZ2h0KTsKICAgICAgICAg
Z2x5cGhPcmlnaW4uc2V0WChnbHlwaE9yaWdpbi54KCkgKyBsYXN0UGFpbnRlZEdseXBoUmVjdC53
aWR0aCgpKTsKIAogICAgICAgICAvLyBUaGVyZSdzIGEgY2hhbmNlIHRoYXQgaWYgdGhlIGZvbnQg
c2l6ZSBpcyBzbWFsbCBlbm91Z2ggdGhlIGdsdWUgZ2x5cGggaGFzIGJlZW4gcmVkdWNlZCB0byBh
biBlbXB0eSByZWN0YW5nbGUKQEAgLTg1MSwyMCArODI4LDIwIEBAIHZvaWQgUmVuZGVyTWF0aE1M
T3BlcmF0b3I6OnBhaW50KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50
T2Zmc2V0CiB7CiAgICAgUmVuZGVyTWF0aE1MVG9rZW46OnBhaW50KGluZm8sIHBhaW50T2Zmc2V0
KTsKIAotICAgIGlmIChpbmZvLmNvbnRleHQoKS5wYWludGluZ0Rpc2FibGVkKCkgfHwgaW5mby5w
aGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCB8fCBzdHlsZSgpLnZpc2liaWxpdHkoKSAhPSBW
SVNJQkxFIHx8IG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3Tm9ybWFsKQorICAgIGlmIChp
bmZvLmNvbnRleHQoKS5wYWludGluZ0Rpc2FibGVkKCkgfHwgaW5mby5waGFzZSAhPSBQYWludFBo
YXNlRm9yZWdyb3VuZCB8fCBzdHlsZSgpLnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IG1fc3Ry
ZXRjaFR5cGUgPT0gVW5zdHJldGNoZWQpCiAgICAgICAgIHJldHVybjsKIAogICAgIEdyYXBoaWNz
Q29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihpbmZvLmNvbnRleHQoKSk7CiAgICAgaW5mby5j
b250ZXh0KCkuc2V0RmlsbENvbG9yKHN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1By
b3BlcnR5Q29sb3IpKTsKIAotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1Np
emVWYXJpYW50KSB7Ci0gICAgICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkuZ2x5
cGgpOworICAgIGlmIChtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJpYW50KSB7CisgICAgICAgIEFT
U0VSVChtX3ZhcmlhbnQuaXNWYWxpZCgpKTsKICAgICAgICAgR2x5cGhCdWZmZXIgYnVmZmVyOwot
ICAgICAgICBidWZmZXIuYWRkKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5nbHlwaCwgbV9zdHJl
dGNoeURhdGEudmFyaWFudCgpLmZvbnQsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlE
YXRhLnZhcmlhbnQoKSkpOworICAgICAgICBidWZmZXIuYWRkKG1fdmFyaWFudC5nbHlwaCwgbV92
YXJpYW50LmZvbnQsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fdmFyaWFudCkpOwogICAgICAgICBM
YXlvdXRQb2ludCBvcGVyYXRvclRvcExlZnQgPSBjZWlsZWRJbnRQb2ludChwYWludE9mZnNldCAr
IGxvY2F0aW9uKCkpOwotICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JH
bHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOworICAgICAgICBGbG9hdFJlY3QgZ2x5cGhC
b3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3ZhcmlhbnQpOwogICAgICAgICBMYXlvdXRQb2ludCBv
cGVyYXRvck9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExlZnQueSgpIC0g
Z2x5cGhCb3VuZHMueSgpKTsKLSAgICAgICAgaW5mby5jb250ZXh0KCkuZHJhd0dseXBocyhzdHls
ZSgpLmZvbnRDYXNjYWRlKCksICptX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkuZm9udCwgYnVmZmVy
LCAwLCAxLCBvcGVyYXRvck9yaWdpbik7CisgICAgICAgIGluZm8uY29udGV4dCgpLmRyYXdHbHlw
aHMoc3R5bGUoKS5mb250Q2FzY2FkZSgpLCAqbV92YXJpYW50LmZvbnQsIGJ1ZmZlciwgMCwgMSwg
b3BlcmF0b3JPcmlnaW4pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC04NzcsMzAgKzg1
NCwzMCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludChQYWludEluZm8mIGluZm8s
IGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldAogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6cGFpbnRWZXJ0aWNhbEdseXBoQXNzZW1ibHkoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBMYXlv
dXRQb2ludCYgcGFpbnRPZmZzZXQpCiB7CiAgICAgQVNTRVJUKG1faXNWZXJ0aWNhbCk7Ci0gICAg
QVNTRVJUKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7Ci0gICAg
QVNTRVJUKG1fc3RyZXRjaHlEYXRhLnRvcCgpLmdseXBoKTsKLSAgICBBU1NFUlQobV9zdHJldGNo
eURhdGEuYm90dG9tKCkuZ2x5cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBlID09IEdseXBo
QXNzZW1ibHkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LnRvcC5pc1ZhbGlkKCkpOworICAgIEFT
U0VSVChtX2Fzc2VtYmx5LmJvdHRvbS5pc1ZhbGlkKCkpOwogCiAgICAgLy8gV2UgYXJlIHBvc2l0
aW9uaW5nIHRoZSBnbHlwaHMgc28gdGhhdCB0aGUgZWRnZSBvZiB0aGUgdGlnaHQgZ2x5cGggYm91
bmRzIGxpbmUgdXAgZXhhY3RseSB3aXRoIHRoZSBlZGdlcyBvZiBvdXIgcGFpbnQgYm94LgogICAg
IExheW91dFBvaW50IG9wZXJhdG9yVG9wTGVmdCA9IHBhaW50T2Zmc2V0ICsgbG9jYXRpb24oKTsK
ICAgICBvcGVyYXRvclRvcExlZnQubW92ZShzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSA/IG1fbGVhZGluZ1NwYWNlIDogbV90cmFpbGluZ1NwYWNlLCAwKTsKICAgICBvcGVyYXRvclRv
cExlZnQgPSBjZWlsZWRJbnRQb2ludChvcGVyYXRvclRvcExlZnQpOwotICAgIEZsb2F0UmVjdCB0
b3BHbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnRvcCgpKTsKKyAg
ICBGbG9hdFJlY3QgdG9wR2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5LnRv
cCk7CiAgICAgTGF5b3V0UG9pbnQgdG9wR2x5cGhPcmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwg
b3BlcmF0b3JUb3BMZWZ0LnkoKSAtIHRvcEdseXBoQm91bmRzLnkoKSk7Ci0gICAgTGF5b3V0UmVj
dCB0b3BHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9zdHJldGNoeURhdGEudG9w
KCksIHRvcEdseXBoT3JpZ2luLCBUcmltQm90dG9tKTsKKyAgICBMYXlvdXRSZWN0IHRvcEdseXBo
UGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LnRvcCwgdG9wR2x5cGhPcmln
aW4sIFRyaW1Cb3R0b20pOwogCi0gICAgRmxvYXRSZWN0IGJvdHRvbUdseXBoQm91bmRzID0gYm91
bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEuYm90dG9tKCkpOworICAgIEZsb2F0UmVjdCBib3R0
b21HbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNzZW1ibHkuYm90dG9tKTsKICAgICBM
YXlvdXRQb2ludCBib3R0b21HbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBvcGVyYXRv
clRvcExlZnQueSgpICsgb2Zmc2V0SGVpZ2h0KCkgLSAoYm90dG9tR2x5cGhCb3VuZHMuaGVpZ2h0
KCkgKyBib3R0b21HbHlwaEJvdW5kcy55KCkpKTsKLSAgICBMYXlvdXRSZWN0IGJvdHRvbUdseXBo
UGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5ib3R0b20oKSwgYm90
dG9tR2x5cGhPcmlnaW4sIFRyaW1Ub3ApOworICAgIExheW91dFJlY3QgYm90dG9tR2x5cGhQYWlu
dFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fYXNzZW1ibHkuYm90dG9tLCBib3R0b21HbHlwaE9y
aWdpbiwgVHJpbVRvcCk7CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEubWlkZGxlKCkuZ2x5cGgp
IHsKKyAgICBpZiAobV9hc3NlbWJseS5taWRkbGUuaXNWYWxpZCgpKSB7CiAgICAgICAgIC8vIENl
bnRlciB0aGUgZ2x5cGggb3JpZ2luIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgZ2x5cGggcGFp
bnQgZXh0ZW50cy4gVGhlbiBzaGlmdCBpdCBoYWxmIHRoZSBwYWludCBoZWlnaHQgdG93YXJkIHRo
ZSBib3R0b20gZ2x5cGguCi0gICAgICAgIEZsb2F0UmVjdCBtaWRkbGVHbHlwaEJvdW5kcyA9IGJv
dW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpKTsKKyAgICAgICAgRmxvYXRSZWN0
IG1pZGRsZUdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5taWRkbGUpOwog
ICAgICAgICBMYXlvdXRQb2ludCBtaWRkbGVHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgp
LCB0b3BHbHlwaE9yaWdpbi55KCkpOwogICAgICAgICBtaWRkbGVHbHlwaE9yaWdpbi5tb3ZlQnko
TGF5b3V0UG9pbnQoMCwgKGJvdHRvbUdseXBoUGFpbnRSZWN0LnkoKSAtIHRvcEdseXBoUGFpbnRS
ZWN0Lm1heFkoKSkgLyAyLjApKTsKICAgICAgICAgbWlkZGxlR2x5cGhPcmlnaW4ubW92ZUJ5KExh
eW91dFBvaW50KDAsIG1pZGRsZUdseXBoQm91bmRzLmhlaWdodCgpIC8gMi4wKSk7CiAKLSAgICAg
ICAgTGF5b3V0UmVjdCBtaWRkbGVHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9z
dHJldGNoeURhdGEubWlkZGxlKCksIG1pZGRsZUdseXBoT3JpZ2luLCBUcmltVG9wQW5kQm90dG9t
KTsKKyAgICAgICAgTGF5b3V0UmVjdCBtaWRkbGVHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgo
aW5mbywgbV9hc3NlbWJseS5taWRkbGUsIG1pZGRsZUdseXBoT3JpZ2luLCBUcmltVG9wQW5kQm90
dG9tKTsKICAgICAgICAgZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKGluZm8sIHRvcEds
eXBoUGFpbnRSZWN0Lm1pblhNYXhZQ29ybmVyKCksIG1pZGRsZUdseXBoUGFpbnRSZWN0Lm1pblhN
aW5ZQ29ybmVyKCkpOwogICAgICAgICBmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoaW5m
bywgbWlkZGxlR2x5cGhQYWludFJlY3QubWluWE1heFlDb3JuZXIoKSwgYm90dG9tR2x5cGhQYWlu
dFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgfSBlbHNlCkBAIC05MTAsMjYgKzg4NywyNiBA
QCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRpY2FsR2x5cGhBc3NlbWJseShQ
YWludEluZm8mIGluZm8sIGNvbnN0IExheQogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFp
bnRIb3Jpem9udGFsR2x5cGhBc3NlbWJseShQYWludEluZm8mIGluZm8sIGNvbnN0IExheW91dFBv
aW50JiBwYWludE9mZnNldCkKIHsKICAgICBBU1NFUlQoIW1faXNWZXJ0aWNhbCk7Ci0gICAgQVNT
RVJUKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7Ci0gICAgQVNT
RVJUKG1fc3RyZXRjaHlEYXRhLmxlZnQoKS5nbHlwaCk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlE
YXRhLnJpZ2h0KCkuZ2x5cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBlID09IEdseXBoQXNz
ZW1ibHkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LmxlZnQuaXNWYWxpZCgpKTsKKyAgICBBU1NF
UlQobV9hc3NlbWJseS5yaWdodC5pc1ZhbGlkKCkpOwogCiAgICAgLy8gV2UgYXJlIHBvc2l0aW9u
aW5nIHRoZSBnbHlwaHMgc28gdGhhdCB0aGUgZWRnZSBvZiB0aGUgdGlnaHQgZ2x5cGggYm91bmRz
IGxpbmUgdXAgZXhhY3RseSB3aXRoIHRoZSBlZGdlcyBvZiBvdXIgcGFpbnQgYm94LgogICAgIExh
eW91dFBvaW50IG9wZXJhdG9yVG9wTGVmdCA9IHBhaW50T2Zmc2V0ICsgbG9jYXRpb24oKTsKICAg
ICBvcGVyYXRvclRvcExlZnQubW92ZShtX2xlYWRpbmdTcGFjZSwgMCk7CiAgICAgb3BlcmF0b3JU
b3BMZWZ0ID0gY2VpbGVkSW50UG9pbnQob3BlcmF0b3JUb3BMZWZ0KTsKICAgICBMYXlvdXRQb2lu
dCBsZWZ0R2x5cGhPcmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwgb3BlcmF0b3JUb3BMZWZ0Lnko
KSArIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUpOwotICAgIExheW91dFJlY3QgbGVmdEds
eXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5sZWZ0KCksIGxl
ZnRHbHlwaE9yaWdpbiwgVHJpbVJpZ2h0KTsKKyAgICBMYXlvdXRSZWN0IGxlZnRHbHlwaFBhaW50
UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5sZWZ0LCBsZWZ0R2x5cGhPcmlnaW4s
IFRyaW1SaWdodCk7CiAKLSAgICBGbG9hdFJlY3QgcmlnaHRHbHlwaEJvdW5kcyA9IGJvdW5kc0Zv
ckdseXBoKG1fc3RyZXRjaHlEYXRhLnJpZ2h0KCkpOworICAgIEZsb2F0UmVjdCByaWdodEdseXBo
Qm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5yaWdodCk7CiAgICAgTGF5b3V0UG9p
bnQgcmlnaHRHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpICsgb2Zmc2V0V2lkdGgoKSAt
IHJpZ2h0R2x5cGhCb3VuZHMud2lkdGgoKSwgb3BlcmF0b3JUb3BMZWZ0LnkoKSArIG1fc3RyZXRj
aEhlaWdodEFib3ZlQmFzZWxpbmUpOwotICAgIExheW91dFJlY3QgcmlnaHRHbHlwaFBhaW50UmVj
dCA9IHBhaW50R2x5cGgoaW5mbywgbV9zdHJldGNoeURhdGEucmlnaHQoKSwgcmlnaHRHbHlwaE9y
aWdpbiwgVHJpbUxlZnQpOworICAgIExheW91dFJlY3QgcmlnaHRHbHlwaFBhaW50UmVjdCA9IHBh
aW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5yaWdodCwgcmlnaHRHbHlwaE9yaWdpbiwgVHJpbUxl
ZnQpOwogCi0gICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLmdseXBoKSB7CisgICAgaWYg
KG1fYXNzZW1ibHkubWlkZGxlLmlzVmFsaWQoKSkgewogICAgICAgICAvLyBDZW50ZXIgdGhlIGds
eXBoIG9yaWdpbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGdseXBoIHBhaW50IGV4dGVudHMu
CiAgICAgICAgIExheW91dFBvaW50IG1pZGRsZUdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54
KCksIGxlZnRHbHlwaE9yaWdpbi55KCkpOwogICAgICAgICBtaWRkbGVHbHlwaE9yaWdpbi5tb3Zl
QnkoTGF5b3V0UG9pbnQoKHJpZ2h0R2x5cGhQYWludFJlY3QueCgpIC0gbGVmdEdseXBoUGFpbnRS
ZWN0Lm1heFgoKSkgLyAyLjAsIDApKTsKLSAgICAgICAgTGF5b3V0UmVjdCBtaWRkbGVHbHlwaFBh
aW50UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9zdHJldGNoeURhdGEubWlkZGxlKCksIG1pZGRs
ZUdseXBoT3JpZ2luLCBUcmltTGVmdEFuZFJpZ2h0KTsKKyAgICAgICAgTGF5b3V0UmVjdCBtaWRk
bGVHbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5taWRkbGUsIG1p
ZGRsZUdseXBoT3JpZ2luLCBUcmltTGVmdEFuZFJpZ2h0KTsKICAgICAgICAgZmlsbFdpdGhIb3Jp
em9udGFsRXh0ZW5zaW9uR2x5cGgoaW5mbywgbGVmdEdseXBoUGFpbnRSZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIG1pZGRsZUdseXBoUGFpbnRSZWN0Lm1pblhNaW5ZQ29ybmVyKCkpOwogICAgICAgICBm
aWxsV2l0aEhvcml6b250YWxFeHRlbnNpb25HbHlwaChpbmZvLCBtaWRkbGVHbHlwaFBhaW50UmVj
dC5tYXhYTWluWUNvcm5lcigpLCByaWdodEdseXBoUGFpbnRSZWN0Lm1pblhNaW5ZQ29ybmVyKCkp
OwogICAgIH0gZWxzZQpAQCAtOTM5LDcgKzkxNiw3IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OnBhaW50SG9yaXpvbnRhbEdseXBoQXNzZW1ibHkoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBM
CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludENoaWxkcmVuKFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQsIFBhaW50SW5mbyYgcGFpbnRJ
bmZvRm9yQ2hpbGQsIGJvb2wgdXNlUHJpbnRSZWN0KQogewogICAgIC8vIFdlIHNraXAgcGFpbnRp
bmcgZm9yIGludmlzaWJsZSBvcGVyYXRvcnMgdG9vIHRvIGF2b2lkIHNvbWUgIm1pc3NpbmcgY2hh
cmFjdGVyIiBnbHlwaCB0byBhcHBlYXIgaWYgYXBwcm9wcmlhdGUgbWF0aCBmb250cyBhcmUgbm90
IGF2YWlsYWJsZS4KLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpICE9IERyYXdOb3JtYWwg
fHwgaXNJbnZpc2libGVPcGVyYXRvcigpKQorICAgIGlmIChtX3N0cmV0Y2hUeXBlICE9IFVuc3Ry
ZXRjaGVkIHx8IGlzSW52aXNpYmxlT3BlcmF0b3IoKSkKICAgICAgICAgcmV0dXJuOwogICAgIFJl
bmRlck1hdGhNTFRva2VuOjpwYWludENoaWxkcmVuKHBhaW50SW5mbywgcGFpbnRPZmZzZXQsIHBh
aW50SW5mb0ZvckNoaWxkLCB1c2VQcmludFJlY3QpOwogfQpAQCAtOTU0LDE5ICs5MzEsMTkgQEAg
TGF5b3V0VW5pdCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dHJhaWxpbmdTcGFjZUVycm9yKCkKICAg
ICAvLyBIZW5jZSB3ZSBkZXRlcm1pbmUgdGhlIGVycm9yIGluIHRoZSBsb2dpY2FsIHdpZHRoIHdp
dGggcmVzcGVjdCB0byB0aGUgYWN0dWFsIHdpZHRoIG9mIHRoZSBnbHlwaChzKSB1c2VkIHRvIHBh
aW50IHRoZSBvcGVyYXRvci4KICAgICBMYXlvdXRVbml0IHdpZHRoID0gbG9naWNhbFdpZHRoKCk7
CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdOb3JtYWwpIHsKKyAgICBp
ZiAobV9zdHJldGNoVHlwZSA9PSBVbnN0cmV0Y2hlZCkgewogICAgICAgICBHbHlwaERhdGEgZGF0
YSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIodGV4dENvbnRl
bnQoKSwgIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKTsKICAgICAgICAgcmV0dXJu
IHdpZHRoIC0gYWR2YW5jZVdpZHRoRm9yR2x5cGgoZGF0YSk7CiAgICAgfQogCi0gICAgaWYgKG1f
c3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpCi0gICAgICAgIHJldHVybiB3
aWR0aCAtIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7Cisg
ICAgaWYgKG1fc3RyZXRjaFR5cGUgPT0gU2l6ZVZhcmlhbnQpCisgICAgICAgIHJldHVybiB3aWR0
aCAtIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fdmFyaWFudCk7CiAKLSAgICBmbG9hdCBhc3NlbWJs
eVdpZHRoID0gYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEudG9wKCkpOwotICAg
IGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JH
bHlwaChtX3N0cmV0Y2h5RGF0YS5ib3R0b20oKSkpOwotICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6
Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5l
eHRlbnNpb24oKSkpOwotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkKLSAg
ICAgICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgsIGFkdmFuY2VXaWR0
aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpKSk7CisgICAgZmxvYXQgYXNzZW1ibHlX
aWR0aCA9IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fYXNzZW1ibHkudG9wKTsKKyAgICBhc3NlbWJs
eVdpZHRoID0gc3RkOjptYXgoYXNzZW1ibHlXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9h
c3NlbWJseS5ib3R0b20pKTsKKyAgICBhc3NlbWJseVdpZHRoID0gc3RkOjptYXgoYXNzZW1ibHlX
aWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9hc3NlbWJseS5leHRlbnNpb24pKTsKKyAgICBp
ZiAobV9hc3NlbWJseS5taWRkbGUuaXNWYWxpZCgpKQorICAgICAgICBhc3NlbWJseVdpZHRoID0g
c3RkOjptYXgoYXNzZW1ibHlXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9hc3NlbWJseS5t
aWRkbGUpKTsKICAgICByZXR1cm4gd2lkdGggLSBhc3NlbWJseVdpZHRoOwogfQogCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9y
LmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9y
LmgKaW5kZXggYWRhMDlkNS4uZjA4NjgxMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaApAQCAtNTEsNyArNTEsNyBA
QCBwdWJsaWM6CiAgICAgLy8gRklYTUU6IFRoZSBkaXNwbGF5c3R5bGUgcHJvcGVydHkgaXMgbm90
IGltcGxlbWVudGVkIChodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE4
NzM3KS4KICAgICBib29sIGlzTGFyZ2VPcGVyYXRvckluRGlzcGxheVN0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gIWhhc09wZXJhdG9yRmxhZyhNYXRoTUxPcGVyYXRvckRpY3Rpb25hcnk6OlN0cmV0Y2h5
KSAmJiBoYXNPcGVyYXRvckZsYWcoTWF0aE1MT3BlcmF0b3JEaWN0aW9uYXJ5OjpMYXJnZU9wKTsg
fQogICAgIGJvb2wgaXNWZXJ0aWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1faXNWZXJ0aWNhbDsgfQot
ICAgIExheW91dFVuaXQgaXRhbGljQ29ycmVjdGlvbigpIGNvbnN0OworICAgIExheW91dFVuaXQg
aXRhbGljQ29ycmVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faXRhbGljQ29ycmVjdGlvbjsgfQog
CiAgICAgdm9pZCBzdHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVuY2UsIGNvbnN0IFJlbmRlclN0
eWxlKiBvbGRTdHlsZSkgZmluYWw7CiAgICAgdm9pZCB1cGRhdGVTdHlsZSgpIGZpbmFsOwpAQCAt
NzMsNjAgKzczLDMxIEBAIHByb3RlY3RlZDoKICAgICBVQ2hhciB0ZXh0Q29udGVudCgpIGNvbnN0
IHsgcmV0dXJuIG1fdGV4dENvbnRlbnQ7IH0KIAogcHJpdmF0ZToKLSAgICBlbnVtIERyYXdNb2Rl
IHsKLSAgICAgICAgRHJhd05vcm1hbCwgRHJhd1NpemVWYXJpYW50LCBEcmF3R2x5cGhBc3NlbWJs
eQorICAgIHN0cnVjdCBHbHlwaEFzc2VtYmx5RGF0YSB7CisgICAgICAgIHVuaW9uIHsKKyAgICAg
ICAgICAgIEdseXBoRGF0YSB0b3A7CisgICAgICAgICAgICBHbHlwaERhdGEgcmlnaHQ7CisgICAg
ICAgIH07CisgICAgICAgIEdseXBoRGF0YSBleHRlbnNpb247CisgICAgICAgIHVuaW9uIHsKKyAg
ICAgICAgICAgIEdseXBoRGF0YSBib3R0b207CisgICAgICAgICAgICBHbHlwaERhdGEgbGVmdDsK
KyAgICAgICAgfTsKKyAgICAgICAgR2x5cGhEYXRhIG1pZGRsZTsKKyAgICBHbHlwaEFzc2VtYmx5
RGF0YSgpCisgICAgOiB0b3AoKSwgZXh0ZW5zaW9uKCksIGJvdHRvbSgpLCBtaWRkbGUoKSB7IH0K
ICAgICB9OwotCi0gICAgY2xhc3MgU3RyZXRjaHlEYXRhIHsKLSAgICBwdWJsaWM6Ci0gICAgICAg
IERyYXdNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgR2x5cGhE
YXRhIHZhcmlhbnQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMF07IH0KLSAgICAgICAgR2x5cGhE
YXRhIHRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVswXTsgfQotICAgICAgICBHbHlwaERhdGEg
ZXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzFdOyB9Ci0gICAgICAgIEdseXBoRGF0
YSBib3R0b20oKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMl07IH0KLSAgICAgICAgR2x5cGhEYXRh
IG1pZGRsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVszXTsgfQotICAgICAgICBHbHlwaERhdGEg
bGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVsyXTsgfQotICAgICAgICBHbHlwaERhdGEgcmln
aHQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMF07IH0KLQotICAgICAgICB2b2lkIHNldE5vcm1h
bE1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX21vZGUgPSBEcmF3Tm9ybWFsOwotICAg
ICAgICB9Ci0gICAgICAgIHZvaWQgc2V0U2l6ZVZhcmlhbnRNb2RlKGNvbnN0IEdseXBoRGF0YSYg
dmFyaWFudCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9tb2RlID0gRHJhd1NpemVWYXJpYW50
OwotICAgICAgICAgICAgbV9kYXRhWzBdID0gdmFyaWFudDsKLSAgICAgICAgfQotICAgICAgICB2
b2lkIHNldEdseXBoQXNzZW1ibHlNb2RlKGNvbnN0IEdseXBoRGF0YSYgdG9wLCBjb25zdCBHbHlw
aERhdGEmIGV4dGVuc2lvbiwgY29uc3QgR2x5cGhEYXRhJiBib3R0b20sIGNvbnN0IEdseXBoRGF0
YSYgbWlkZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX21vZGUgPSBEcmF3R2x5cGhBc3Nl
bWJseTsKLSAgICAgICAgICAgIG1fZGF0YVswXSA9IHRvcDsKLSAgICAgICAgICAgIG1fZGF0YVsx
XSA9IGV4dGVuc2lvbjsKLSAgICAgICAgICAgIG1fZGF0YVsyXSA9IGJvdHRvbTsKLSAgICAgICAg
ICAgIG1fZGF0YVszXSA9IG1pZGRsZTsKLSAgICAgICAgfQotICAgICAgICBTdHJldGNoeURhdGEo
KQotICAgICAgICAgICAgOiBtX21vZGUoRHJhd05vcm1hbCkgeyB9Ci0gICAgICAgIFN0cmV0Y2h5
RGF0YShjb25zdCBTdHJldGNoeURhdGEmIGRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3
aXRjaCAoZGF0YS5tX21vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgRHJhd05vcm1hbDoKLSAgICAg
ICAgICAgICAgICBzZXROb3JtYWxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBjYXNlIERyYXdTaXplVmFyaWFudDoKLSAgICAgICAgICAgICAgICBzZXRTaXplVmFy
aWFudE1vZGUoZGF0YS52YXJpYW50KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgY2FzZSBEcmF3R2x5cGhBc3NlbWJseToKLSAgICAgICAgICAgICAgICBzZXRHbHlwaEFz
c2VtYmx5TW9kZShkYXRhLnRvcCgpLCBkYXRhLmV4dGVuc2lvbigpLCBkYXRhLmJvdHRvbSgpLCBk
YXRhLm1pZGRsZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRHJhd01vZGUgbV9tb2RlOwotICAgICAg
ICAvLyBGSVhNRTogRm9yIE9wZW5UeXBlIGZvbnRzIHdpdGggYSBNQVRIIHRhYmxlIGFsbCB0aGUg
Z2x5cGhzIGFyZSBmcm9tIHRoZSBzYW1lIGZvbnQsIHNvIHdlIHdvdWxkIG9ubHkgbmVlZCB0byBz
dG9yZSB0aGUgZ2x5cGggaW5kaWNlcyBoZXJlLgotICAgICAgICBHbHlwaERhdGEgbV9kYXRhWzRd
OworICAgIGVudW0gU3RyZXRjaFR5cGUgeworICAgICAgICBVbnN0cmV0Y2hlZCwKKyAgICAgICAg
U2l6ZVZhcmlhbnQsCisgICAgICAgIEdseXBoQXNzZW1ibHkKKyAgICB9OworICAgIFN0cmV0Y2hU
eXBlIG1fc3RyZXRjaFR5cGU7CisgICAgdW5pb24geworICAgICAgICBHbHlwaERhdGEgbV92YXJp
YW50OworICAgICAgICBHbHlwaEFzc2VtYmx5RGF0YSBtX2Fzc2VtYmx5OwogICAgIH07CisgICAg
TGF5b3V0VW5pdCBtX2l0YWxpY0NvcnJlY3Rpb247CiAKICAgICBjb25zdCBjaGFyKiByZW5kZXJO
YW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaXNBbm9ueW1vdXMoKSA/ICJSZW5kZXJNYXRo
TUxPcGVyYXRvciAoYW5vbnltb3VzKSIgOiAiUmVuZGVyTWF0aE1MT3BlcmF0b3IiOyB9CiAgICAg
dm9pZCBwYWludENoaWxkcmVuKFBhaW50SW5mbyYgZm9yU2VsZiwgY29uc3QgTGF5b3V0UG9pbnQm
LCBQYWludEluZm8mIGZvckNoaWxkLCBib29sIHVzZVByaW50UmVjdCkgZmluYWw7CkBAIC0xNDIs
OSArMTEzLDExIEBAIHByaXZhdGU6CiAgICAgYm9vbCBzaG91bGRBbGxvd1N0cmV0Y2hpbmcoKSBj
b25zdDsKIAogICAgIGJvb2wgZ2V0QmFzZUdseXBoKGNvbnN0IFJlbmRlclN0eWxlJiwgR2x5cGhE
YXRhJikgY29uc3Q7Ci0gICAgYm9vbCBnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9yPE9w
ZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4sIFN0cmV0Y2h5RGF0YSYpIGNvbnN0OwotICAg
IFN0cmV0Y2h5RGF0YSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCkgY29uc3Q7Ci0gICAg
U3RyZXRjaHlEYXRhIGZpbmRTdHJldGNoeURhdGEoVUNoYXIsIGZsb2F0KiBtYXhpbXVtR2x5cGhX
aWR0aCk7CisgICAgdm9pZCBzZXRTaXplVmFyaWFudChjb25zdCBHbHlwaERhdGEmKTsKKyAgICB2
b2lkIHNldEdseXBoQXNzZW1ibHkoY29uc3QgR2x5cGhBc3NlbWJseURhdGEmKTsKKyAgICBib29s
IGdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1i
bHlQYXJ0PiwgR2x5cGhBc3NlbWJseURhdGEmKSBjb25zdDsKKyAgICB2b2lkIGZpbmREaXNwbGF5
U3R5bGVMYXJnZU9wZXJhdG9yKCk7CisgICAgdm9pZCBmaW5kU3RyZXRjaHlEYXRhKGZsb2F0KiBt
YXhpbXVtR2x5cGhXaWR0aCwgTGF5b3V0VW5pdCB0YXJnZXRTaXplID0gMCk7CiAKICAgICBlbnVt
IEdseXBoUGFpbnRUcmltbWluZyB7CiAgICAgICAgIFRyaW1Ub3AsCkBAIC0xNzYsNyArMTQ5LDYg
QEAgcHJpdmF0ZToKICAgICBMYXlvdXRVbml0IG1fdHJhaWxpbmdTcGFjZTsKICAgICBMYXlvdXRV
bml0IG1fbWluU2l6ZTsKICAgICBMYXlvdXRVbml0IG1fbWF4U2l6ZTsKLSAgICBTdHJldGNoeURh
dGEgbV9zdHJldGNoeURhdGE7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0tIAoyLjgu
MC5yYzMKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>277471</attachid>
            <date>2016-04-27 05:56:13 -0700</date>
            <delta_ts>2016-05-06 06:55:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>0002-GlyphAssemblyData.patch</filename>
            <type>text/plain</type>
            <size>41417</size>
            <attacher name="Frédéric Wang Nélar">fred.wang</attacher>
            
              <data encoding="base64">RnJvbSA1MTZkNDczMDA5OTQyYjAzMWM4MDNkYmJjMTFmYTExMmNmNjNjYmQxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBGcmVkZXJpYyBXYW5nIDxmcmVkLndhbmdAZnJlZS5mcj4KRGF0
ZTogVHVlLCAyNiBBcHIgMjAxNiAwOTowMToyOSArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMDIvMTld
IEdseXBoQXNzZW1ibHlEYXRhCgotLS0KIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHwgIDU0ICsrKysKIC4uLi9yZW5kZXJpbmcvbWF0aG1sL1JlbmRl
ck1hdGhNTE9wZXJhdG9yLmNwcCAgICAgIHwgMjk1ICsrKysrKysrKystLS0tLS0tLS0tLQogLi4u
L3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaCAgICAgICAgfCAgODYgKyst
LS0tCiAzIGZpbGVzIGNoYW5nZWQsIDIxOSBpbnNlcnRpb25zKCspLCAyMTYgZGVsZXRpb25zKC0p
CgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUv
Q2hhbmdlTG9nCmluZGV4IGJkNGEyYzIuLmQ5MjgwNDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1
NyBAQAorMjAxNi0wNC0yMiAgRnJlZGVyaWMgV2FuZyAgPGZ3YW5nQGlnYWxpYS5jb20+CisKKyAg
ICAgICAgUmVuZGVyTWF0aE1MT3BlcmF0b3I6IHJlZmFjdG9yIG1hbmFnZW1lbnQgb2Ygc3RyZXRj
aHkgZGF0YSBhbmQgaXRhbGljIGNvcnJlY3Rpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjkxMworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgYmVoYXZpb3IgaXMgbm90IGNoYW5n
ZWQuCisKKyAgICAgICAgV2UgdXNlIHVuaW9uIHRvIHNpbXBsaWZ5IHRoZSBzdHJ1Y3R1cmUgdXNl
ZCB0byBtYW5hZ2UgdGhlIGdseXBoIGFzc2VtYmx5IGFuZCB0aGUgdHlwZSBvZiBzdHJldGNoaW5n
LgorICAgICAgICBXZSBhbHNvIG1vZGlmeSB0aGUgc2lnbmF0dXJlIG9mIHNvbWUgZnVuY3Rpb25z
IHRvIHJldHJpZXZlIGRpc3BsYXkgb3BlcmF0b3IgYW5kIHN0cmV0Y2h5IGRhdGEuCisgICAgICAg
IEZpbmFsbHksIHdlIGludHJvZHVjZSBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gZWFzaWx5IHNl
dCB0aGUgc3RyZXRjaHkgZGF0YS4KKworICAgICAgICAqIHJlbmRlcmluZy9tYXRobWwvUmVuZGVy
TWF0aE1MT3BlcmF0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmNvbXB1dGVQcmVmZXJyZWRMb2dpY2FsV2lkdGhzKTogVXNlIHRoZSBuZXcgZGF0YSBtZW1i
ZXJzIGFuZCBmdW5jdGlvbiBzaWduYXR1cmVzLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0
aE1MT3BlcmF0b3I6OnNldFNpemVWYXJpYW50KTogTmV3IGhlbHBlciBmdW5jdGlvbiB0byBzZXQg
YSBzaXplIHZhcmlhbnQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
c2V0R2x5cGhBc3NlbWJseSk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGEgZ2x5cGggYXNz
ZW1ibHkuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhB
c3NlbWJseUZhbGxCYWNrKTogV2UgY2hhbmdlIHRoZSBzaWduYXR1cmUgdG8gdXNlIGEgR2x5cGhB
c3NlbWJseURhdGEuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Zmlu
ZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IpOiBXZSByZW5hbWUgdGhlIGZ1bmN0aW9uIGFuZAor
ICAgICAgICBjaGFuZ2UgaXRzIHNpZ25hdHVyZSB0byByZW1vdmUgdGhlIHJldHVybiB2YWx1ZS4K
KyAgICAgICAgV2Ugbm93IGFsc28gc2V0IHRoZSBpdGFsaWMgY29ycmVjdGlvbiB3aGVuIGEgZGlz
cGxheSBvcGVyYXRvciBpcyBmb3VuZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpmaW5kU3RyZXRjaHlEYXRhKTogV2UgY2hhbmdlIHRoZSBzaWduYXR1cmUgdG8gaW50
cm9kdWNlIGEKKyAgICAgICAgdGFyZ2V0IHNpemUgYW5kIHJlbW92ZSB0aGUgcmV0dXJuIHZhbHVl
LgorICAgICAgICBUaGlzIGFsc28gZG9lcyB0aGUgZWFybHkgcmV0dXJuIHdoZW4gdGhlIGJhc2Ug
Z2x5cGggaXMgbGFyZ2UgZW5vdWdoLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnVwZGF0ZVN0eWxlKTogV2UgdXNlIHRoZSBuZXcgZGF0YSBtZW1iZXJzIGFuZCBmdW5j
dGlvbiBzaWduYXR1cmVzLgorICAgICAgICBUaGUgY2hlY2sgZm9yIHRoZSBiYXNlIGdseXBoIHNp
emUgaXMgbm93IGRvbmUgaW4gZmluZFN0cmV0Y2h5RGF0YSwgc28gd2UganVzdCBjaGVjayB3aGV0
aGVyCisgICAgICAgIG1fc3RyZXRjaFR5cGUgaXMgVW5zdHJldGNoZWQgdG8gZG8gYW4gZWFybHkg
cmV0dXJuLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpcnN0TGlu
ZUJhc2VsaW5lKTogV2UgdXNlIG1fc3RyZXRjaFR5cGUuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9u
R2x5cGgpOiBVc2UgdGhlIG5ldyBjbGFzcyBtZW1iZXJzLgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnQpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRpY2Fs
R2x5cGhBc3NlbWJseSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50SG9yaXpvbnRhbEdseXBoQXNzZW1ibHkpOiBEaXR0by4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludENoaWxkcmVuKTogRGl0dG8uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dHJhaWxpbmdTcGFjZUVycm9yKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXRhbGljQ29y
cmVjdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6Z2V0RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcik6IERlbGV0ZWQuCisgICAgICAgICogcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyTWF0aE1MT3BlcmF0b3I6Oml0YWxpY0NvcnJlY3Rpb24pOiBXZSBqdXN0IHJldHVybiBt
X2l0YWxpY0NvcnJlY3Rpb24uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6R2x5cGhBc3NlbWJseURhdGE6OkdseXBoQXNzZW1ibHlEYXRhKTogTmV3IGNsYXNzIHRvIHN0
b3JlIGFuIGFzc2VtYmx5IG9mIEdseXBoRGF0YS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1h
dGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6Om1vZGUpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6dmFyaWFudCk6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRh
Ojp0b3ApOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6
OlN0cmV0Y2h5RGF0YTo6ZXh0ZW5zaW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OmJvdHRvbSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjptaWRkbGUp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0
Y2h5RGF0YTo6bGVmdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxP
cGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpyaWdodCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpzZXROb3JtYWxNb2RlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURh
dGE6OnNldFNpemVWYXJpYW50TW9kZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjpzZXRHbHlwaEFzc2VtYmx5TW9kZSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlE
YXRhOjpTdHJldGNoeURhdGEpOiBEZWxldGVkLgorCiAyMDE2LTA0LTIyICBGcmVkZXJpYyBXYW5n
ICA8ZnJlZC53YW5nQGZyZWUuZnI+CiAKICAgICAgICAgUmVuZGVyTWF0aE1MT3BlcmF0b3IgcmVm
YWN0b3Jpbmc6IGludHJvZHVjZSBnZXRCYXNlR2x5cGggYW5kIHJlbW92ZSBwYXJhbWV0ZXIgZnJv
bSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCmluZGV4IDg4Njdk
MTcuLjQ1ZjVhOGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9t
YXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuY3BwCkBAIC0yMDIsMTggKzIwMiw2IEBAIGJvb2wg
UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmlzQ2hpbGRBbGxvd2VkKGNvbnN0IFJlbmRlck9iamVjdCYs
IGNvbnN0IFJlbmRlclN0eWxlCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1MYXlvdXRVbml0IFJl
bmRlck1hdGhNTE9wZXJhdG9yOjppdGFsaWNDb3JyZWN0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAo
aXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBw
cmltYXJ5Rm9udCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgpOwotICAgICAg
ICBpZiAoYXV0byogbWF0aERhdGEgPSBwcmltYXJ5Rm9udC5tYXRoRGF0YSgpKSB7Ci0gICAgICAg
ICAgICBTdHJldGNoeURhdGEgbGFyZ2VPcGVyYXRvciA9IGdldERpc3BsYXlTdHlsZUxhcmdlT3Bl
cmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBtYXRoRGF0YS0+Z2V0SXRhbGljQ29ycmVjdGlv
bihwcmltYXJ5Rm9udCwgbGFyZ2VPcGVyYXRvci52YXJpYW50KCkuZ2x5cGgpOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpz
dHJldGNoVG8oTGF5b3V0VW5pdCBoZWlnaHRBYm92ZUJhc2VsaW5lLCBMYXlvdXRVbml0IGRlcHRo
QmVsb3dCYXNlbGluZSkKIHsKICAgICBBU1NFUlQoaGFzT3BlcmF0b3JGbGFnKE1hdGhNTE9wZXJh
dG9yRGljdGlvbmFyeTo6U3RyZXRjaHkpKTsKQEAgLTMxNyw5ICszMDUsOSBAQCB2b2lkIFJlbmRl
ck1hdGhNTE9wZXJhdG9yOjpjb21wdXRlUHJlZmVycmVkTG9naWNhbFdpZHRocygpCiAgICAgfQog
ICAgIGlmIChpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKSB7CiAgICAgICAgIC8vIExh
cmdlIG9wZXJhdG9ycyBpbiBTVElYIFdvcmQgaGF2ZSBpbmNvcnJlY3QgYWR2YW5jZSB3aWR0aCwg
Y2F1c2luZyBtaXNwbGFjZW1lbnQgb2Ygc3VwZXJzY3JpcHQsIHNvIHdlIHVzZSB0aGUgZ2x5cGgg
Ym91bmQgaW5zdGVhZCAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wL3N0aXhmb250cy90cmFja2lu
Zy80OS8pLgotICAgICAgICBTdHJldGNoeURhdGEgbGFyZ2VPcGVyYXRvciA9IGdldERpc3BsYXlT
dHlsZUxhcmdlT3BlcmF0b3IoKTsKLSAgICAgICAgaWYgKGxhcmdlT3BlcmF0b3IubW9kZSgpID09
IERyYXdTaXplVmFyaWFudCkKLSAgICAgICAgICAgIG1heGltdW1HbHlwaFdpZHRoID0gYm91bmRz
Rm9yR2x5cGgobGFyZ2VPcGVyYXRvci52YXJpYW50KCkpLndpZHRoKCk7CisgICAgICAgIGZpbmRE
aXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7CisgICAgICAgIGlmIChtX3N0cmV0Y2hUeXBlID09
IFNpemVWYXJpYW50KQorICAgICAgICAgICAgbWF4aW11bUdseXBoV2lkdGggPSBib3VuZHNGb3JH
bHlwaChtX3ZhcmlhbnQpLndpZHRoKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUU6
IHNvbWUgZ2x5cGhzIChlLmcuIHRoZSBvbmUgZm9yICJGUkFDVElPTiBTTEFTSCIgaW4gdGhlIFNU
SVggTWF0aCBmb250IG9yIGxhcmdlIG9wZXJhdG9ycykgaGF2ZSBhIHdpZHRoIHRoYXQgZGVwZW5k
cyBvbiB0aGUgaGVpZ2h0LCByZXN1bHRpbmcgaW4gbGFyZ2UgZ2FwcyAoaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMDMyNikuCiAgICAgICAgIGZpbmRTdHJldGNoeURh
dGEoJm1heGltdW1HbHlwaFdpZHRoKTsKQEAgLTM5MiwxMyArMzgwLDIxIEBAIGJvb2wgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OmdldEJhc2VHbHlwaChjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUsIEds
eXBoRGF0YSYgYmFzCiAgICAgcmV0dXJuIGJhc2VHbHlwaC5pc1ZhbGlkKCkgJiYgYmFzZUdseXBo
LmZvbnQgPT0gJnN0eWxlLmZvbnRDYXNjYWRlKCkucHJpbWFyeUZvbnQoKTsKIH0KIAotYm9vbCBS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVu
VHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+IGFzc2VtYmx5UGFydHMsIFN0cmV0Y2h5RGF0YSYg
c3RyZXRjaHlEYXRhKSBjb25zdAordm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c2V0U2l6ZVZh
cmlhbnQoY29uc3QgR2x5cGhEYXRhJiBzaXplVmFyaWFudCkKIHsKLSAgICBHbHlwaERhdGEgdG9w
OwotICAgIEdseXBoRGF0YSBleHRlbnNpb247Ci0gICAgR2x5cGhEYXRhIGJvdHRvbTsKLSAgICBH
bHlwaERhdGEgbWlkZGxlOworICAgIEFTU0VSVChzaXplVmFyaWFudC5pc1ZhbGlkKCkgJiYgc2l6
ZVZhcmlhbnQuZm9udC0+bWF0aERhdGEoKSk7CisgICAgbV9zdHJldGNoVHlwZSA9IFNpemVWYXJp
YW50OworICAgIG1fdmFyaWFudCA9IHNpemVWYXJpYW50OworfQogCit2b2lkIFJlbmRlck1hdGhN
TE9wZXJhdG9yOjpzZXRHbHlwaEFzc2VtYmx5KGNvbnN0IEdseXBoQXNzZW1ibHlEYXRhJiBhc3Nl
bWJseURhdGEpCit7CisgICAgbV9zdHJldGNoVHlwZSA9IEdseXBoQXNzZW1ibHk7CisgICAgbV9h
c3NlbWJseSA9IGFzc2VtYmx5RGF0YTsKK30KKworYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
Z2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJs
eVBhcnQ+IGFzc2VtYmx5UGFydHMsIEdseXBoQXNzZW1ibHlEYXRhJiBhc3NlbWJseURhdGEpIGNv
bnN0Cit7CiAgICAgLy8gVGhlIHN0cnVjdHVyZSBvZiB0aGUgT3BlbiBUeXBlIE1hdGggdGFibGUg
aXMgYSBiaXQgbW9yZSBnZW5lcmFsIHRoYW4gdGhlIG9uZSBjdXJyZW50bHkgdXNlZCBieSB0aGUg
UmVuZGVyTWF0aE1MT3BlcmF0b3IgY29kZSwgc28gd2UgdHJ5IHRvIGZhbGxiYWNrIGluIGEgcmVh
c29uYWJsZSB3YXkuCiAgICAgLy8gRklYTUU6IFJlbmRlck1hdGhNTE9wZXJhdG9yIHNob3VsZCBz
dXBwb3J0IHRoZSBtb3N0IGdlbmVyYWwgZm9ybWF0IChodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTMwMzI3KS4KICAgICAvLyBXZSB1c2UgdGhlIGFwcHJvYWNoIG9mIHRo
ZSBjb3B5Q29tcG9uZW50cyBmdW5jdGlvbiBpbiBnaXRodWIuY29tL21hdGhqYXgvTWF0aEpheC1k
ZXYvYmxvYi9tYXN0ZXIvZm9udHMvT3BlblR5cGVNYXRoL2ZvbnRVdGlsLnB5CkBAIC00MjIsOCAr
NDE4LDggQEAgYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhBc3NlbWJseUZhbGxC
YWNrKFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3MKICAgICAgICAgTm9uZQogICAgIH07CiAg
ICAgUGFydFR5cGUgZXhwZWN0ZWRQYXJ0VHlwZSA9IFN0YXJ0OwotICAgIGV4dGVuc2lvbi5nbHlw
aCA9IDA7Ci0gICAgbWlkZGxlLmdseXBoID0gMDsKKyAgICBhc3NlbWJseURhdGEuZXh0ZW5zaW9u
LmdseXBoID0gMDsKKyAgICBhc3NlbWJseURhdGEubWlkZGxlLmdseXBoID0gMDsKICAgICBmb3Ig
KGF1dG8mIHBhcnQgOiBhc3NlbWJseVBhcnRzKSB7CiAgICAgICAgIGlmIChub25FeHRlbmRlckNv
dW50IDwgMykgewogICAgICAgICAgICAgLy8gSWYgd2Ugb25seSBoYXZlIGF0IG1vc3QgdHdvIG5v
bi1leHRlbmRlcnMgdGhlbiB3ZSBza2lwIHRoZSBtaWRkbGUgZ2x5cGguCkBAIC00MzMsOSArNDI5
LDkgQEAgYm9vbCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0R2x5cGhBc3NlbWJseUZhbGxCYWNr
KFZlY3RvcjxPcGVuVHlwZU1hdGhEYXRhOjpBc3MKICAgICAgICAgICAgICAgICBleHBlY3RlZFBh
cnRUeXBlID0gRW5kOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJ0LmlzRXh0ZW5kZXIpIHsK
LSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmdseXBoKQotICAgICAgICAgICAgICAgIGV4dGVu
c2lvbi5nbHlwaCA9IHBhcnQuZ2x5cGg7IC8vIFdlIGNvcHkgdGhlIGV4dGVuZGVyIHBhcnQuCi0g
ICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24uZ2x5cGggIT0gcGFydC5nbHlwaCkKKyAgICAg
ICAgICAgIGlmICghYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaCkKKyAgICAgICAgICAgICAg
ICBhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoID0gcGFydC5nbHlwaDsgLy8gV2UgY29weSB0
aGUgZXh0ZW5kZXIgcGFydC4KKyAgICAgICAgICAgIGVsc2UgaWYgKGFzc2VtYmx5RGF0YS5leHRl
bnNpb24uZ2x5cGggIT0gcGFydC5nbHlwaCkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
IC8vIFRoaXMgaXMgbm90IHN1cHBvcnRlZDogdGhlIGFzc2VtYmx5IGhhcyBkaWZmZXJlbnQgZXh0
ZW5kZXJzLgogCiAgICAgICAgICAgICBzd2l0Y2ggKGV4cGVjdGVkUGFydFR5cGUpIHsKQEAgLTQ2
MSwxOSArNDU3LDE5IEBAIGJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1i
bHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzCiAgICAgICAgIHN3aXRjaCAo
ZXhwZWN0ZWRQYXJ0VHlwZSkgewogICAgICAgICBjYXNlIFN0YXJ0OgogICAgICAgICAgICAgLy8g
V2UgY29weSB0aGUgbGVmdC9ib3R0b20gcGFydC4KLSAgICAgICAgICAgIGJvdHRvbS5nbHlwaCA9
IHBhcnQuZ2x5cGg7CisgICAgICAgICAgICBhc3NlbWJseURhdGEuYm90dG9tLmdseXBoID0gcGFy
dC5nbHlwaDsKICAgICAgICAgICAgIGV4cGVjdGVkUGFydFR5cGUgPSBFeHRlbmRlckJldHdlZW5T
dGFydEFuZE1pZGRsZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIEV4dGVu
ZGVyQmV0d2VlblN0YXJ0QW5kTWlkZGxlOgogICAgICAgICBjYXNlIE1pZGRsZToKICAgICAgICAg
ICAgIC8vIFdlIGNvcHkgdGhlIG1pZGRsZSBwYXJ0LgotICAgICAgICAgICAgbWlkZGxlLmdseXBo
ID0gcGFydC5nbHlwaDsKKyAgICAgICAgICAgIGFzc2VtYmx5RGF0YS5taWRkbGUuZ2x5cGggPSBw
YXJ0LmdseXBoOwogICAgICAgICAgICAgZXhwZWN0ZWRQYXJ0VHlwZSA9IEV4dGVuZGVyQmV0d2Vl
bk1pZGRsZUFuZEVuZDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIEV4dGVu
ZGVyQmV0d2Vlbk1pZGRsZUFuZEVuZDoKICAgICAgICAgY2FzZSBFbmQ6CiAgICAgICAgICAgICAv
LyBXZSBjb3B5IHRoZSByaWdodC90b3AgcGFydC4KLSAgICAgICAgICAgIHRvcC5nbHlwaCA9IHBh
cnQuZ2x5cGg7CisgICAgICAgICAgICBhc3NlbWJseURhdGEudG9wLmdseXBoID0gcGFydC5nbHlw
aDsKICAgICAgICAgICAgIGV4cGVjdGVkUGFydFR5cGUgPSBOb25lOwogICAgICAgICAgICAgY29u
dGludWU7CiAgICAgICAgIGNhc2UgTm9uZToKQEAgLTQ4MiwzNSArNDc4LDMwIEBAIGJvb2wgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5
cGVNYXRoRGF0YTo6QXNzCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWV4dGVuc2lvbi5n
bHlwaCkKKyAgICBpZiAoIWFzc2VtYmx5RGF0YS5leHRlbnNpb24uZ2x5cGgpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsgLy8gVGhpcyBpcyBub3Qgc3VwcG9ydGVkOiB3ZSBhbHdheXMgYXNzdW1lIHRo
YXQgd2UgaGF2ZSBhbiBleHRlbnNpb24gZ2x5cGguCiAKICAgICAvLyBJZiB3ZSBkb24ndCBoYXZl
IHRvcC9ib3R0b20gZ2x5cGhzLCB3ZSB1c2UgdGhlIGV4dGVuc2lvbiBnbHlwaC4KLSAgICBpZiAo
IXRvcC5nbHlwaCkKLSAgICAgICAgdG9wLmdseXBoID0gZXh0ZW5zaW9uLmdseXBoOwotICAgIGlm
ICghYm90dG9tLmdseXBoKQotICAgICAgICBib3R0b20uZ2x5cGggPSBleHRlbnNpb24uZ2x5cGg7
CisgICAgaWYgKCFhc3NlbWJseURhdGEudG9wLmdseXBoKQorICAgICAgICBhc3NlbWJseURhdGEu
dG9wLmdseXBoID0gYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaDsKKyAgICBpZiAoIWFzc2Vt
Ymx5RGF0YS5ib3R0b20uZ2x5cGgpCisgICAgICAgIGFzc2VtYmx5RGF0YS5ib3R0b20uZ2x5cGgg
PSBhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoOwogCi0gICAgdG9wLmZvbnQgPSAmc3R5bGUo
KS5mb250Q2FzY2FkZSgpLnByaW1hcnlGb250KCk7Ci0gICAgZXh0ZW5zaW9uLmZvbnQgPSB0b3Au
Zm9udDsKLSAgICBib3R0b20uZm9udCA9IHRvcC5mb250OwotICAgIGlmIChtaWRkbGUuZ2x5cGgp
Ci0gICAgICAgIG1pZGRsZS5mb250ID0gdG9wLmZvbnQ7Ci0KLSAgICBzdHJldGNoeURhdGEuc2V0
R2x5cGhBc3NlbWJseU1vZGUodG9wLCBleHRlbnNpb24sIGJvdHRvbSwgbWlkZGxlKTsKKyAgICBh
c3NlbWJseURhdGEudG9wLmZvbnQgPSAmc3R5bGUoKS5mb250Q2FzY2FkZSgpLnByaW1hcnlGb250
KCk7CisgICAgYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5mb250ID0gYXNzZW1ibHlEYXRhLnRvcC5m
b250OworICAgIGFzc2VtYmx5RGF0YS5ib3R0b20uZm9udCA9IGFzc2VtYmx5RGF0YS50b3AuZm9u
dDsKKyAgICBhc3NlbWJseURhdGEubWlkZGxlLmZvbnQgPSBhc3NlbWJseURhdGEubWlkZGxlLmds
eXBoID8gYXNzZW1ibHlEYXRhLnRvcC5mb250IDogbnVsbHB0cjsKIAogICAgIHJldHVybiB0cnVl
OwogfQogCi1SZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhIFJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCkgY29uc3QKK3ZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OmZpbmREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCkKIHsKLSAgICBT
dHJldGNoeURhdGEgZGF0YTsKLQogICAgIEFTU0VSVChtX2lzVmVydGljYWwgJiYgaXNMYXJnZU9w
ZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSk7CiAKICAgICBHbHlwaERhdGEgYmFzZUdseXBoOwogICAg
IGlmICghZ2V0QmFzZUdseXBoKHN0eWxlKCksIGJhc2VHbHlwaCkgfHwgIWJhc2VHbHlwaC5mb250
LT5tYXRoRGF0YSgpKQotICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgcmV0dXJuOwogCiAg
ICAgVmVjdG9yPEdseXBoPiBzaXplVmFyaWFudHM7CiAgICAgVmVjdG9yPE9wZW5UeXBlTWF0aERh
dGE6OkFzc2VtYmx5UGFydD4gYXNzZW1ibHlQYXJ0czsKQEAgLTUyMSw1MyArNTEyLDU0IEBAIFJl
bmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6Omdl
dERpc3BsYXlTdHlsZUxhcmdlT3BlCiAgICAgYmFzZUdseXBoLmZvbnQtPm1hdGhEYXRhKCktPmdl
dE1hdGhWYXJpYW50cyhiYXNlR2x5cGguZ2x5cGgsIHRydWUsIHNpemVWYXJpYW50cywgYXNzZW1i
bHlQYXJ0cyk7CiAKICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0IHNpemUgdmFyaWFudCB0aGF0
IGlzIGxhcmdlciB0aGFuIHRoZSBleHBlY3RlZCBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQgYW5k
IG90aGVyd2lzZSBmYWxsYmFjayB0byB0aGUgbGFyZ2VzdCB2YXJpYW50LgotICAgIGZvciAoYXV0
byYgdmFyaWFudCA6IHNpemVWYXJpYW50cykgewotICAgICAgICBHbHlwaERhdGEgc2l6ZVZhcmlh
bnQ7Ci0gICAgICAgIHNpemVWYXJpYW50LmdseXBoID0gdmFyaWFudDsKLSAgICAgICAgc2l6ZVZh
cmlhbnQuZm9udCA9IGJhc2VHbHlwaC5mb250OwotICAgICAgICBkYXRhLnNldFNpemVWYXJpYW50
TW9kZShzaXplVmFyaWFudCk7Ci0gICAgICAgIGlmIChib3VuZHNGb3JHbHlwaChzaXplVmFyaWFu
dCkuaGVpZ2h0KCkgPj0gZGlzcGxheU9wZXJhdG9yTWluSGVpZ2h0KQotICAgICAgICAgICAgcmV0
dXJuIGRhdGE7CisgICAgZm9yIChhdXRvJiBzaXplVmFyaWFudCA6IHNpemVWYXJpYW50cykgewor
ICAgICAgICBHbHlwaERhdGEgZ2x5cGhEYXRhKHNpemVWYXJpYW50LCBiYXNlR2x5cGguZm9udCk7
CisgICAgICAgIHNldFNpemVWYXJpYW50KGdseXBoRGF0YSk7CisgICAgICAgIG1faXRhbGljQ29y
cmVjdGlvbiA9IGdseXBoRGF0YS5mb250LT5tYXRoRGF0YSgpLT5nZXRJdGFsaWNDb3JyZWN0aW9u
KCpnbHlwaERhdGEuZm9udCwgZ2x5cGhEYXRhLmdseXBoKTsKKyAgICAgICAgaWYgKGhlaWdodEZv
ckdseXBoKGdseXBoRGF0YSkgPj0gZGlzcGxheU9wZXJhdG9yTWluSGVpZ2h0KQorICAgICAgICAg
ICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBkYXRhOwogfQogCi1SZW5kZXJNYXRoTUxPcGVy
YXRvcjo6U3RyZXRjaHlEYXRhIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaW5kU3RyZXRjaHlEYXRh
KGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0aCkKK3ZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZp
bmRTdHJldGNoeURhdGEoZmxvYXQqIG1heGltdW1HbHlwaFdpZHRoLCBMYXlvdXRVbml0IHRhcmdl
dFNpemUpCiB7CiAgICAgQVNTRVJUKCFtYXhpbXVtR2x5cGhXaWR0aCB8fCBtX2lzVmVydGljYWwp
OwogCi0gICAgU3RyZXRjaHlEYXRhIGRhdGE7Ci0gICAgU3RyZXRjaHlEYXRhIGFzc2VtYmx5RGF0
YTsKLQogICAgIEdseXBoRGF0YSBiYXNlR2x5cGg7CiAgICAgaWYgKCFnZXRCYXNlR2x5cGgoc3R5
bGUoKSwgYmFzZUdseXBoKSkKLSAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJldHVybjsK
ICAgICAKKyAgICBpZiAoIW1heGltdW1HbHlwaFdpZHRoKSB7CisgICAgICAgIC8vIFdlIGRvIG5v
dCBzdHJldGNoIGlmIHRoZSBiYXNlIGdseXBoIGlzIGxhcmdlIGVub3VnaC4KKyAgICAgICAgZmxv
YXQgYmFzZVNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRGb3JHbHlwaChiYXNlR2x5cGgpIDog
YWR2YW5jZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBoKTsKKyAgICAgICAgaWYgKHRhcmdldFNpemUg
PD0gYmFzZVNpemUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgR2x5cGhBc3Nl
bWJseURhdGEgYXNzZW1ibHlEYXRhOwogICAgIGlmIChiYXNlR2x5cGguZm9udC0+bWF0aERhdGEo
KSkgewogICAgICAgICBWZWN0b3I8R2x5cGg+IHNpemVWYXJpYW50czsKICAgICAgICAgVmVjdG9y
PE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4gYXNzZW1ibHlQYXJ0czsKICAgICAgICAg
YmFzZUdseXBoLmZvbnQtPm1hdGhEYXRhKCktPmdldE1hdGhWYXJpYW50cyhiYXNlR2x5cGguZ2x5
cGgsIG1faXNWZXJ0aWNhbCwgc2l6ZVZhcmlhbnRzLCBhc3NlbWJseVBhcnRzKTsKICAgICAgICAg
Ly8gV2UgdmVyaWZ5IHRoZSBzaXplIHZhcmlhbnRzLgotICAgICAgICBmb3IgKGF1dG8mIHZhcmlh
bnQgOiBzaXplVmFyaWFudHMpIHsKLSAgICAgICAgICAgIEdseXBoRGF0YSBzaXplVmFyaWFudDsK
LSAgICAgICAgICAgIHNpemVWYXJpYW50LmdseXBoID0gdmFyaWFudDsKLSAgICAgICAgICAgIHNp
emVWYXJpYW50LmZvbnQgPSBiYXNlR2x5cGguZm9udDsKKyAgICAgICAgZm9yIChhdXRvJiBzaXpl
VmFyaWFudCA6IHNpemVWYXJpYW50cykgeworICAgICAgICAgICAgR2x5cGhEYXRhIGdseXBoRGF0
YShzaXplVmFyaWFudCwgYmFzZUdseXBoLmZvbnQpOwogICAgICAgICAgICAgaWYgKG1heGltdW1H
bHlwaFdpZHRoKQotICAgICAgICAgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4
KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoc2l6ZVZhcmlhbnQpKTsK
KyAgICAgICAgICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUds
eXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGdseXBoRGF0YSkpOwogICAgICAgICAgICAg
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXRTaXplVmFyaWFudE1vZGUoc2l6ZVZhcmlh
bnQpOwotICAgICAgICAgICAgICAgIGZsb2F0IHNpemUgPSBtX2lzVmVydGljYWwgPyBoZWlnaHRG
b3JHbHlwaChzaXplVmFyaWFudCkgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChzaXplVmFyaWFudCk7
Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gc3RyZXRjaFNpemUoKSkgCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIHNldFNpemVWYXJpYW50KGds
eXBoRGF0YSk7CisgICAgICAgICAgICAgICAgZmxvYXQgc2l6ZSA9IG1faXNWZXJ0aWNhbCA/IGhl
aWdodEZvckdseXBoKGdseXBoRGF0YSkgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChnbHlwaERhdGEp
OworICAgICAgICAgICAgICAgIGlmIChzaXplID49IHRhcmdldFNpemUpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFdl
IHZlcmlmeSBpZiB0aGVyZSBpcyBhIGNvbnN0cnVjdGlvbi4KICAgICAgICAgaWYgKCFnZXRHbHlw
aEFzc2VtYmx5RmFsbEJhY2soYXNzZW1ibHlQYXJ0cywgYXNzZW1ibHlEYXRhKSkKLSAgICAgICAg
ICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAg
ICAgIGlmICghbV9pc1ZlcnRpY2FsKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAg
ICAgICByZXR1cm47CiAKICAgICAgICAgLy8gSWYgdGhlIGZvbnQgZG9lcyBub3QgaGF2ZSBhIE1B
VEggdGFibGUsIHdlIGZhbGxiYWNrIHRvIHRoZSBVbmljb2RlLW9ubHkgY29uc3RydWN0aW9ucy4K
ICAgICAgICAgY29uc3QgU3RyZXRjaHlDaGFyYWN0ZXIqIHN0cmV0Y2h5Q2hhcmFjdGVyID0gbnVs
bHB0cjsKQEAgLTU4NSw0NSArNTc3LDMyIEBAIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNo
eURhdGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRTdHJldGNoeURhdGEoZmxvYXQqCiAKICAg
ICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBzdHJldGNoeSBjaGFyYWN0ZXIgc2V0IGZvciB0
aGlzIGNoYXJhY3Rlciwgd2UgZG9uJ3Qga25vdyBob3cgdG8gc3RyZXRjaCBpdC4KICAgICAgICAg
aWYgKCFzdHJldGNoeUNoYXJhY3RlcikKLSAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAg
ICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8vIFdlIGNvbnZlcnQgdGhlIGxpc3Qgb2YgVW5pY29k
ZSBjaGFyYWN0ZXJzIGludG8gYSBsaXN0IG9mIGdseXBoIGRhdGEuCi0gICAgICAgIEdseXBoRGF0
YSB0b3AgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0
Y2h5Q2hhcmFjdGVyLT50b3BDaGFyLCBmYWxzZSk7Ci0gICAgICAgIEdseXBoRGF0YSBleHRlbnNp
b24gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5
Q2hhcmFjdGVyLT5leHRlbnNpb25DaGFyLCBmYWxzZSk7Ci0gICAgICAgIEdseXBoRGF0YSBib3R0
b20gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5
Q2hhcmFjdGVyLT5ib3R0b21DaGFyLCBmYWxzZSk7Ci0gICAgICAgIEdseXBoRGF0YSBtaWRkbGU7
Ci0gICAgICAgIGlmIChzdHJldGNoeUNoYXJhY3Rlci0+bWlkZGxlQ2hhcikKLSAgICAgICAgICAg
IG1pZGRsZSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3Ry
ZXRjaHlDaGFyYWN0ZXItPm1pZGRsZUNoYXIsIGZhbHNlKTsKLSAgICAgICAgYXNzZW1ibHlEYXRh
LnNldEdseXBoQXNzZW1ibHlNb2RlKHRvcCwgZXh0ZW5zaW9uLCBib3R0b20sIG1pZGRsZSk7Cisg
ICAgICAgIGFzc2VtYmx5RGF0YS50b3AgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRh
Rm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT50b3BDaGFyLCBmYWxzZSk7CisgICAgICAg
IGFzc2VtYmx5RGF0YS5leHRlbnNpb24gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhEYXRh
Rm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5leHRlbnNpb25DaGFyLCBmYWxzZSk7Cisg
ICAgICAgIGFzc2VtYmx5RGF0YS5ib3R0b20gPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkuZ2x5cGhE
YXRhRm9yQ2hhcmFjdGVyKHN0cmV0Y2h5Q2hhcmFjdGVyLT5ib3R0b21DaGFyLCBmYWxzZSk7Cisg
ICAgICAgIGFzc2VtYmx5RGF0YS5taWRkbGUgPSBzdHJldGNoeUNoYXJhY3Rlci0+bWlkZGxlQ2hh
ciA/IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlD
aGFyYWN0ZXItPm1pZGRsZUNoYXIsIGZhbHNlKSA6IEdseXBoRGF0YSgpOwogICAgIH0KIAotICAg
IEFTU0VSVChhc3NlbWJseURhdGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLQogICAg
IC8vIElmIHdlIGFyZSBtZWFzdXJpbmcgdGhlIG1heGltdW0gd2lkdGgsIHZlcmlmeSBlYWNoIGNv
bXBvbmVudC4KICAgICBpZiAobWF4aW11bUdseXBoV2lkdGgpIHsKLSAgICAgICAgKm1heGltdW1H
bHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JH
bHlwaChhc3NlbWJseURhdGEudG9wKCkpKTsKLSAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0g
c3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJs
eURhdGEuZXh0ZW5zaW9uKCkpKTsKLSAgICAgICAgaWYgKGFzc2VtYmx5RGF0YS5taWRkbGUoKS5n
bHlwaCkKLSAgICAgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVt
R2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSgpKSk7
Ci0gICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0
aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmJvdHRvbSgpKSk7Ci0gICAgICAg
IHJldHVybiBhc3NlbWJseURhdGE7CisgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6
bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRh
LnRvcCkpOworICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUds
eXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5leHRlbnNpb24pKTsK
KyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRo
LCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKSk7CisgICAgICAgICpt
YXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmJvdHRvbSkpOworICAgICAgICByZXR1cm47CiAgICAg
fQogCiAgICAgLy8gV2UgZW5zdXJlIHRoYXQgdGhlIHNpemUgaXMgbGFyZ2UgZW5vdWdoIHRvIGF2
b2lkIGdseXBoIG92ZXJsYXBzLgotICAgIGZsb2F0IHNpemU7Ci0gICAgaWYgKG1faXNWZXJ0aWNh
bCkgewotICAgICAgICBzaXplID0gaGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLnRvcCgpKSAr
IGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS5ib3R0b20oKSk7Ci0gICAgICAgIGlmIChhc3Nl
bWJseURhdGEubWlkZGxlKCkuZ2x5cGgpCi0gICAgICAgICAgICBzaXplICs9IGhlaWdodEZvckds
eXBoKGFzc2VtYmx5RGF0YS5taWRkbGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2l6ZSA9
IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5sZWZ0KCkpICsgYWR2YW5jZVdpZHRo
Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLnJpZ2h0KCkpOwotICAgICAgICBpZiAoYXNzZW1ibHlEYXRh
Lm1pZGRsZSgpLmdseXBoKQotICAgICAgICAgICAgc2l6ZSArPSBhZHZhbmNlV2lkdGhGb3JHbHlw
aChhc3NlbWJseURhdGEubWlkZGxlKCkpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA+IHN0cmV0Y2hT
aXplKCkpCi0gICAgICAgIHJldHVybiBkYXRhOworICAgIGZsb2F0IG1pblNpemUgPSBtX2lzVmVy
dGljYWwgPworICAgICAgICBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEudG9wKSArIGhlaWdo
dEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpICsgaGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlE
YXRhLmJvdHRvbSkKKyAgICAgICAgOiBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEu
bGVmdCkgKyBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKSArIGFkdmFu
Y2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5yaWdodCk7CisgICAgaWYgKG1pblNpemUgPiB0
YXJnZXRTaXplKQorICAgICAgICByZXR1cm47CiAKLSAgICByZXR1cm4gYXNzZW1ibHlEYXRhOwor
ICAgIHNldEdseXBoQXNzZW1ibHkoYXNzZW1ibHlEYXRhKTsKIH0KIAogdm9pZCBSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUoKQpAQCAtNjMyLDcgKzYxMSw4IEBAIHZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OnVwZGF0ZVN0eWxlKCkKICAgICBpZiAoIWZpcnN0Q2hpbGQoKSkKICAg
ICAgICAgcmV0dXJuOwogCi0gICAgbV9zdHJldGNoeURhdGEuc2V0Tm9ybWFsTW9kZSgpOworICAg
IG1fc3RyZXRjaFR5cGUgPSBVbnN0cmV0Y2hlZDsKKyAgICBtX2l0YWxpY0NvcnJlY3Rpb24gPSAw
OwogICAgIC8vIFdlIGFkZCBzcGFjaW5nIGFyb3VuZCB0aGUgb3BlcmF0b3IuCiAgICAgLy8gRklY
TUU6IFRoZSBzcGFjaW5nIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgd2hvbGUgZW1iZWxsaXNoZWQg
b3BlcmF0b3IgKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjQ4MzEp
LgogICAgIC8vIEZJWE1FOiBUaGUgc3BhY2luZyBzaG91bGQgb25seSBiZSBhZGRlZCBpbnNpZGUg
KHBlcmhhcHMgaW5mZXJyZWQpIG1yb3cgKGh0dHA6Ly93d3cudzMub3JnL1RSL01hdGhNTC9jaGFw
dGVyMy5odG1sI3ByZXNtLm9wc3BhY2luZykuCkBAIC02NDcsMjcgKzYyNywyNCBAQCB2b2lkIFJl
bmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgICAgIHJldHVybjsKIAogICAg
IGlmIChtX2lzVmVydGljYWwgJiYgaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSkKLSAg
ICAgICAgbV9zdHJldGNoeURhdGEgPSBnZXREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7Cisg
ICAgICAgIGZpbmREaXNwbGF5U3R5bGVMYXJnZU9wZXJhdG9yKCk7CiAgICAgZWxzZSB7Ci0gICAg
ICAgIC8vIFdlIGRvIG5vdCBzdHJldGNoIGlmIHRoZSBiYXNlIGdseXBoIGlzIGxhcmdlIGVub3Vn
aC4KLSAgICAgICAgR2x5cGhEYXRhIGJhc2VHbHlwaCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIobV90ZXh0Q29udGVudCwgIXN0eWxlKCkuaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbigpKTsKLSAgICAgICAgZmxvYXQgYmFzZVNpemUgPSBtX2lzVmVydGljYWwgPyBo
ZWlnaHRGb3JHbHlwaChiYXNlR2x5cGgpIDogYWR2YW5jZVdpZHRoRm9yR2x5cGgoYmFzZUdseXBo
KTsKLSAgICAgICAgaWYgKHN0cmV0Y2hTaXplKCkgPD0gYmFzZVNpemUpCisgICAgICAgIGZpbmRT
dHJldGNoeURhdGEobnVsbHB0ciwgc3RyZXRjaFNpemUoKSk7CisgICAgICAgIGlmIChtX3N0cmV0
Y2hUeXBlID09IFVuc3RyZXRjaGVkKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3N0
cmV0Y2h5RGF0YSA9IGZpbmRTdHJldGNoeURhdGEobnVsbHB0cik7CiAgICAgfQogCi0gICAgaWYg
KG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1NpemVWYXJpYW50
KSB7CisgICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJpYW50
KSB7CiAgICAgICAgIC8vIFdlIHJlc2l6ZSB0aGUgb3BlcmF0b3IgdG8gbWF0Y2ggdGhlIG9uZSBv
ZiB0aGUgc2l6ZSB2YXJpYW50LgogICAgICAgICBpZiAoaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5
U3R5bGUoKSkgewotICAgICAgICAgICAgLy8gVGhlIHN0cmV0Y2ggc2l6ZSBpcyBhY3R1YWxseSBu
b3QgaW52b2x2ZWQgaW4gdGhlIHNlbGVjdGlvbiBvZiB0aGUgc2l6ZSB2YXJpYW50IGluIGdldERp
c3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCisgICAgICAgICAgICAvLyBUaGUgc3RyZXRjaCBzaXpl
IGlzIGFjdHVhbGx5IG5vdCBpbnZvbHZlZCBpbiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBzaXplIHZh
cmlhbnQgaW4gZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCiAgICAgICAgICAgICAvLyBX
ZSBzaW1wbHkgdXNlIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBzZWxlY3RlZCBzaXplIHZh
cmlhbnQgZ2x5cGguCi0gICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNG
b3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOworICAgICAgICAgICAgRmxvYXRSZWN0
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KTsKICAgICAgICAgICAgIG1f
c3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSAtZ2x5cGhCb3VuZHMueSgpOwogICAgICAgICAg
ICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0gZ2x5cGhCb3VuZHMubWF4WSgpOwogICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2UgcmVzY2FsZSB0aGUgaGVpZ2h0IGFuZCBk
ZXB0aCBwcm9wb3J0aW9uYXRlbHkuCi0gICAgICAgICAgICBmbG9hdCB2YXJpYW50U2l6ZSA9IGhl
aWdodEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgICAgICBmbG9h
dCB2YXJpYW50U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fdmFyaWFudCk7CiAgICAgICAgICAgICBm
bG9hdCBzaXplID0gc3RyZXRjaFNpemUoKTsKICAgICAgICAgICAgIGZsb2F0IGFzcGVjdCA9IHNp
emUgPiAwID8gdmFyaWFudFNpemUgLyBzaXplIDogMS4wOwogICAgICAgICAgICAgbV9zdHJldGNo
SGVpZ2h0QWJvdmVCYXNlbGluZSAqPSBhc3BlY3Q7CkBAIC02NzYsMzAgKzY1MywzMCBAQCB2b2lk
IFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgfQogCiAgICAgaWYgKCFt
X2lzVmVydGljYWwpIHsKLSAgICAgICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3
U2l6ZVZhcmlhbnQpIHsKLSAgICAgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5k
c0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgIGlmIChtX3N0cmV0
Y2hUeXBlID09IFNpemVWYXJpYW50KSB7CisgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3Vu
ZHMgPSBib3VuZHNGb3JHbHlwaChtX3ZhcmlhbnQpOwogICAgICAgICAgICAgbV9zdHJldGNoSGVp
Z2h0QWJvdmVCYXNlbGluZSA9IC1nbHlwaEJvdW5kcy55KCk7CiAgICAgICAgICAgICBtX3N0cmV0
Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBnbHlwaEJvdW5kcy5tYXhZKCk7Ci0gICAgICAgICAgICBt
X3N0cmV0Y2hXaWR0aCA9IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlh
bnQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09IERyYXdH
bHlwaEFzc2VtYmx5KSB7CisgICAgICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFkdmFuY2VXaWR0
aEZvckdseXBoKG1fdmFyaWFudCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9zdHJldGNoVHlwZSA9
PSBHbHlwaEFzc2VtYmx5KSB7CiAgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHM7CiAg
ICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gMDsKICAgICAgICAgICAg
IG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IDA7CiAKLSAgICAgICAgICAgIGdseXBoQm91
bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubGVmdCgpKTsKKyAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5sZWZ0KTsKICAgICAgICAg
ICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0Piht
X3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAgICAgICAg
ICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+KG1f
c3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSwgZ2x5cGhCb3VuZHMubWF4WSgpKTsKIAotICAgICAg
ICAgICAgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5yaWdodCgp
KTsKKyAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5y
aWdodCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gc3RkOjpt
YXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBoQm91bmRz
LnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1h
eDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1h
eFkoKSk7CiAKLSAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJl
dGNoeURhdGEuZXh0ZW5zaW9uKCkpOworICAgICAgICAgICAgZ2x5cGhCb3VuZHMgPSBib3VuZHNG
b3JHbHlwaChtX2Fzc2VtYmx5LmV4dGVuc2lvbik7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWln
aHRBYm92ZUJhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJv
dmVCYXNlbGluZSwgLWdseXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0
aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93
QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGlmIChtX3N0cmV0
Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgewotICAgICAgICAgICAgICAgIGdseXBoQm91bmRzID0g
Ym91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubWlkZGxlKCkpOworICAgICAgICAgICAgaWYg
KG1fYXNzZW1ibHkubWlkZGxlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIGdseXBoQm91
bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5taWRkbGUpOwogICAgICAgICAgICAgICAg
IG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0
cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAgICAgICAgICAg
ICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0Piht
X3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAgICAgICAg
ICAgICB9CkBAIC03MDksMTQgKzY4NiwxNCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1
cGRhdGVTdHlsZSgpCiAKIE9wdGlvbmFsPGludD4gUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpcnN0
TGluZUJhc2VsaW5lKCkgY29uc3QKIHsKLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpICE9
IERyYXdOb3JtYWwpCisgICAgaWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNoZWQpCiAgICAg
ICAgIHJldHVybiBPcHRpb25hbDxpbnQ+KG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUpOwog
ICAgIHJldHVybiBSZW5kZXJNYXRoTUxUb2tlbjo6Zmlyc3RMaW5lQmFzZWxpbmUoKTsKIH0KIAog
dm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQoTGF5b3V0VW5p
dCBsb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExvZ2ljYWxFeHRlbnRDb21w
dXRlZFZhbHVlcyYgY29tcHV0ZWRWYWx1ZXMpIGNvbnN0CiB7Ci0gICAgaWYgKG1fc3RyZXRjaHlE
YXRhLm1vZGUoKSAhPSBEcmF3Tm9ybWFsKQorICAgIGlmIChtX3N0cmV0Y2hUeXBlICE9IFVuc3Ry
ZXRjaGVkKQogICAgICAgICBsb2dpY2FsSGVpZ2h0ID0gbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNl
bGluZSArIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZTsKICAgICBSZW5kZXJCb3g6OmNvbXB1
dGVMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQsIGxvZ2ljYWxUb3AsIGNvbXB1dGVkVmFsdWVz
KTsKIH0KQEAgLTc3Niw4ICs3NTMsOCBAQCBMYXlvdXRSZWN0IFJlbmRlck1hdGhNTE9wZXJhdG9y
OjpwYWludEdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QgR2x5cGhEYXRhJiBkYQogdm9pZCBS
ZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50
SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91dFBvaW50JiB0
bykKIHsKICAgICBBU1NFUlQobV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURh
dGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURh
dGEuZXh0ZW5zaW9uKCkuZ2x5cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBlID09IEdseXBo
QXNzZW1ibHkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LmV4dGVuc2lvbi5pc1ZhbGlkKCkpOwog
ICAgIEFTU0VSVChmcm9tLnkoKSA8PSB0by55KCkpOwogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8g
c3BhY2UgZm9yIHRoZSBleHRlbnNpb24gZ2x5cGgsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhp
bmcuCkBAIC03ODYsNyArNzYzLDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdp
dGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QKIAogICAgIEdy
YXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihpbmZvLmNvbnRleHQoKSk7CiAKLSAg
ICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS5l
eHRlbnNpb24oKSk7CisgICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgo
bV9hc3NlbWJseS5leHRlbnNpb24pOwogCiAgICAgLy8gQ2xpcHBpbmcgdGhlIGV4dGVuZGVyIHJl
Z2lvbiBoZXJlIGFsbG93cyB1cyB0byBkcmF3IHRoZSBib3R0b20gZXh0ZW5kZXIgZ2x5cGggaW50
byB0aGUKICAgICAvLyByZWdpb25zIG9mIHRoZSBib3R0b20gZ2x5cGggd2l0aG91dCB3b3JyeWlu
ZyBhYm91dCBvdmVyZHJhdyAoaGFpcnkgcGl4ZWxzKSBhbmQgc2ltcGxpZmllcyBsYXRlciBjbGlw
cGluZy4KQEAgLTgwMSw3ICs3NzgsNyBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpmaWxs
V2l0aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25zdAogICAgIEZs
b2F0UmVjdCBsYXN0UGFpbnRlZEdseXBoUmVjdChmcm9tLCBGbG9hdFNpemUoKSk7CiAKICAgICB3
aGlsZSAobGFzdFBhaW50ZWRHbHlwaFJlY3QubWF4WSgpIDwgdG8ueSgpKSB7Ci0gICAgICAgIGxh
c3RQYWludGVkR2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5leHRl
bnNpb24oKSwgZ2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAgICBsYXN0UGFp
bnRlZEdseXBoUmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5leHRlbnNpb24sIGds
eXBoT3JpZ2luLCBUcmltVG9wQW5kQm90dG9tKTsKICAgICAgICAgZ2x5cGhPcmlnaW4uc2V0WShn
bHlwaE9yaWdpbi55KCkgKyBsYXN0UGFpbnRlZEdseXBoUmVjdC5oZWlnaHQoKSk7CiAKICAgICAg
ICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0IGlmIHRoZSBmb250IHNpemUgaXMgc21hbGwgZW5v
dWdoIHRoZSBnbHVlIGdseXBoIGhhcyBiZWVuIHJlZHVjZWQgdG8gYW4gZW1wdHkgcmVjdGFuZ2xl
CkBAIC04MTQsOCArNzkxLDggQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhW
ZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QKIHZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5m
byYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91dFBvaW50JiB0bykK
IHsKICAgICBBU1NFUlQoIW1faXNWZXJ0aWNhbCk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRh
Lm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7Ci0gICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRh
LmV4dGVuc2lvbigpLmdseXBoKTsKKyAgICBBU1NFUlQobV9zdHJldGNoVHlwZSA9PSBHbHlwaEFz
c2VtYmx5KTsKKyAgICBBU1NFUlQobV9hc3NlbWJseS5leHRlbnNpb24uaXNWYWxpZCgpKTsKICAg
ICBBU1NFUlQoZnJvbS54KCkgPD0gdG8ueCgpKTsKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIHNw
YWNlIGZvciB0aGUgZXh0ZW5zaW9uIGdseXBoLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5n
LgpAQCAtODM3LDcgKzgxNCw3IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRo
SG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uCiAgICAgRmxvYXRS
ZWN0IGxhc3RQYWludGVkR2x5cGhSZWN0KGZyb20sIEZsb2F0U2l6ZSgpKTsKIAogICAgIHdoaWxl
IChsYXN0UGFpbnRlZEdseXBoUmVjdC5tYXhYKCkgPCB0by54KCkpIHsKLSAgICAgICAgbGFzdFBh
aW50ZWRHbHlwaFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lv
bigpLCBnbHlwaE9yaWdpbiwgVHJpbUxlZnRBbmRSaWdodCk7CisgICAgICAgIGxhc3RQYWludGVk
R2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LmV4dGVuc2lvbiwgZ2x5cGhP
cmlnaW4sIFRyaW1MZWZ0QW5kUmlnaHQpOwogICAgICAgICBnbHlwaE9yaWdpbi5zZXRYKGdseXBo
T3JpZ2luLngoKSArIGxhc3RQYWludGVkR2x5cGhSZWN0LndpZHRoKCkpOwogCiAgICAgICAgIC8v
IFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBpZiB0aGUgZm9udCBzaXplIGlzIHNtYWxsIGVub3VnaCB0
aGUgZ2x1ZSBnbHlwaCBoYXMgYmVlbiByZWR1Y2VkIHRvIGFuIGVtcHR5IHJlY3RhbmdsZQpAQCAt
ODUxLDIwICs4MjgsMjAgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnQoUGFpbnRJ
bmZvJiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQKIHsKICAgICBSZW5kZXJN
YXRoTUxUb2tlbjo6cGFpbnQoaW5mbywgcGFpbnRPZmZzZXQpOwogCi0gICAgaWYgKGluZm8uY29u
dGV4dCgpLnBhaW50aW5nRGlzYWJsZWQoKSB8fCBpbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3Jl
Z3JvdW5kIHx8IHN0eWxlKCkudmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbV9zdHJldGNoeURh
dGEubW9kZSgpID09IERyYXdOb3JtYWwpCisgICAgaWYgKGluZm8uY29udGV4dCgpLnBhaW50aW5n
RGlzYWJsZWQoKSB8fCBpbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHN0eWxl
KCkudmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbV9zdHJldGNoVHlwZSA9PSBVbnN0cmV0Y2hl
ZCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKGluZm8uY29udGV4dCgpKTsKICAgICBpbmZvLmNvbnRleHQoKS5zZXRGaWxsQ29sb3Io
c3R5bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvcikpOwogCi0gICAg
aWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsKLSAgICAgICAg
QVNTRVJUKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5nbHlwaCk7CisgICAgaWYgKG1fc3RyZXRj
aFR5cGUgPT0gU2l6ZVZhcmlhbnQpIHsKKyAgICAgICAgQVNTRVJUKG1fdmFyaWFudC5pc1ZhbGlk
KCkpOwogICAgICAgICBHbHlwaEJ1ZmZlciBidWZmZXI7Ci0gICAgICAgIGJ1ZmZlci5hZGQobV9z
dHJldGNoeURhdGEudmFyaWFudCgpLmdseXBoLCBtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkuZm9u
dCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgpKSk7CisgICAg
ICAgIGJ1ZmZlci5hZGQobV92YXJpYW50LmdseXBoLCBtX3ZhcmlhbnQuZm9udCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgobV92YXJpYW50KSk7CiAgICAgICAgIExheW91dFBvaW50IG9wZXJhdG9yVG9w
TGVmdCA9IGNlaWxlZEludFBvaW50KHBhaW50T2Zmc2V0ICsgbG9jYXRpb24oKSk7Ci0gICAgICAg
IEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZh
cmlhbnQoKSk7CisgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBo
KG1fdmFyaWFudCk7CiAgICAgICAgIExheW91dFBvaW50IG9wZXJhdG9yT3JpZ2luKG9wZXJhdG9y
VG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgLSBnbHlwaEJvdW5kcy55KCkpOwotICAg
ICAgICBpbmZvLmNvbnRleHQoKS5kcmF3R2x5cGhzKHN0eWxlKCkuZm9udENhc2NhZGUoKSwgKm1f
c3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5mb250LCBidWZmZXIsIDAsIDEsIG9wZXJhdG9yT3JpZ2lu
KTsKKyAgICAgICAgaW5mby5jb250ZXh0KCkuZHJhd0dseXBocyhzdHlsZSgpLmZvbnRDYXNjYWRl
KCksICptX3ZhcmlhbnQuZm9udCwgYnVmZmVyLCAwLCAxLCBvcGVyYXRvck9yaWdpbik7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKQEAgLTg3NywzMCArODU0LDMwIEBAIHZvaWQgUmVuZGVyTWF0
aE1MT3BlcmF0b3I6OnBhaW50KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBh
aW50T2Zmc2V0CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRpY2FsR2x5cGhB
c3NlbWJseShQYWludEluZm8mIGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCkK
IHsKICAgICBBU1NFUlQobV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEu
bW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEu
dG9wKCkuZ2x5cGgpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5ib3R0b20oKS5nbHlwaCk7
CisgICAgQVNTRVJUKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAgQVNTRVJU
KG1fYXNzZW1ibHkudG9wLmlzVmFsaWQoKSk7CisgICAgQVNTRVJUKG1fYXNzZW1ibHkuYm90dG9t
LmlzVmFsaWQoKSk7CiAKICAgICAvLyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGdseXBocyBzbyB0
aGF0IHRoZSBlZGdlIG9mIHRoZSB0aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBleGFjdGx5IHdp
dGggdGhlIGVkZ2VzIG9mIG91ciBwYWludCBib3guCiAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JU
b3BMZWZ0ID0gcGFpbnRPZmZzZXQgKyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9yVG9wTGVmdC5t
b3ZlKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gbV9sZWFkaW5nU3BhY2UgOiBt
X3RyYWlsaW5nU3BhY2UsIDApOwogICAgIG9wZXJhdG9yVG9wTGVmdCA9IGNlaWxlZEludFBvaW50
KG9wZXJhdG9yVG9wTGVmdCk7Ci0gICAgRmxvYXRSZWN0IHRvcEdseXBoQm91bmRzID0gYm91bmRz
Rm9yR2x5cGgobV9zdHJldGNoeURhdGEudG9wKCkpOworICAgIEZsb2F0UmVjdCB0b3BHbHlwaEJv
dW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNzZW1ibHkudG9wKTsKICAgICBMYXlvdXRQb2ludCB0
b3BHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExlZnQueSgpIC0g
dG9wR2x5cGhCb3VuZHMueSgpKTsKLSAgICBMYXlvdXRSZWN0IHRvcEdseXBoUGFpbnRSZWN0ID0g
cGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS50b3AoKSwgdG9wR2x5cGhPcmlnaW4sIFRy
aW1Cb3R0b20pOworICAgIExheW91dFJlY3QgdG9wR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBo
KGluZm8sIG1fYXNzZW1ibHkudG9wLCB0b3BHbHlwaE9yaWdpbiwgVHJpbUJvdHRvbSk7CiAKLSAg
ICBGbG9hdFJlY3QgYm90dG9tR2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5
RGF0YS5ib3R0b20oKSk7CisgICAgRmxvYXRSZWN0IGJvdHRvbUdseXBoQm91bmRzID0gYm91bmRz
Rm9yR2x5cGgobV9hc3NlbWJseS5ib3R0b20pOwogICAgIExheW91dFBvaW50IGJvdHRvbUdseXBo
T3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgKyBvZmZzZXRI
ZWlnaHQoKSAtIChib3R0b21HbHlwaEJvdW5kcy5oZWlnaHQoKSArIGJvdHRvbUdseXBoQm91bmRz
LnkoKSkpOwotICAgIExheW91dFJlY3QgYm90dG9tR2x5cGhQYWludFJlY3QgPSBwYWludEdseXBo
KGluZm8sIG1fc3RyZXRjaHlEYXRhLmJvdHRvbSgpLCBib3R0b21HbHlwaE9yaWdpbiwgVHJpbVRv
cCk7CisgICAgTGF5b3V0UmVjdCBib3R0b21HbHlwaFBhaW50UmVjdCA9IHBhaW50R2x5cGgoaW5m
bywgbV9hc3NlbWJseS5ib3R0b20sIGJvdHRvbUdseXBoT3JpZ2luLCBUcmltVG9wKTsKIAotICAg
IGlmIChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgeworICAgIGlmIChtX2Fzc2VtYmx5
Lm1pZGRsZS5pc1ZhbGlkKCkpIHsKICAgICAgICAgLy8gQ2VudGVyIHRoZSBnbHlwaCBvcmlnaW4g
YmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBnbHlwaCBwYWludCBleHRlbnRzLiBUaGVuIHNoaWZ0
IGl0IGhhbGYgdGhlIHBhaW50IGhlaWdodCB0b3dhcmQgdGhlIGJvdHRvbSBnbHlwaC4KLSAgICAg
ICAgRmxvYXRSZWN0IG1pZGRsZUdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNo
eURhdGEubWlkZGxlKCkpOworICAgICAgICBGbG9hdFJlY3QgbWlkZGxlR2x5cGhCb3VuZHMgPSBi
b3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5Lm1pZGRsZSk7CiAgICAgICAgIExheW91dFBvaW50IG1p
ZGRsZUdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIHRvcEdseXBoT3JpZ2luLnkoKSk7
CiAgICAgICAgIG1pZGRsZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgwLCAoYm90dG9t
R2x5cGhQYWludFJlY3QueSgpIC0gdG9wR2x5cGhQYWludFJlY3QubWF4WSgpKSAvIDIuMCkpOwog
ICAgICAgICBtaWRkbGVHbHlwaE9yaWdpbi5tb3ZlQnkoTGF5b3V0UG9pbnQoMCwgbWlkZGxlR2x5
cGhCb3VuZHMuaGVpZ2h0KCkgLyAyLjApKTsKIAotICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUds
eXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKSwg
bWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAgICBMYXlvdXRSZWN0
IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5Lm1pZGRs
ZSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOwogICAgICAgICBmaWxsV2l0
aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoaW5mbywgdG9wR2x5cGhQYWludFJlY3QubWluWE1heFlD
b3JuZXIoKSwgbWlkZGxlR2x5cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgICAg
IGZpbGxXaXRoVmVydGljYWxFeHRlbnNpb25HbHlwaChpbmZvLCBtaWRkbGVHbHlwaFBhaW50UmVj
dC5taW5YTWF4WUNvcm5lcigpLCBib3R0b21HbHlwaFBhaW50UmVjdC5taW5YTWluWUNvcm5lcigp
KTsKICAgICB9IGVsc2UKQEAgLTkxMCwyNiArODg3LDI2IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFzc2VtYmx5KFBhaW50SW5mbyYgaW5mbywgY29uc3Qg
TGF5CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludEhvcml6b250YWxHbHlwaEFzc2Vt
Ymx5KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0KQogewog
ICAgIEFTU0VSVCghbV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubW9k
ZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEubGVm
dCgpLmdseXBoKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEucmlnaHQoKS5nbHlwaCk7Cisg
ICAgQVNTRVJUKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAgQVNTRVJUKG1f
YXNzZW1ibHkubGVmdC5pc1ZhbGlkKCkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LnJpZ2h0Lmlz
VmFsaWQoKSk7CiAKICAgICAvLyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGdseXBocyBzbyB0aGF0
IHRoZSBlZGdlIG9mIHRoZSB0aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBleGFjdGx5IHdpdGgg
dGhlIGVkZ2VzIG9mIG91ciBwYWludCBib3guCiAgICAgTGF5b3V0UG9pbnQgb3BlcmF0b3JUb3BM
ZWZ0ID0gcGFpbnRPZmZzZXQgKyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9yVG9wTGVmdC5tb3Zl
KG1fbGVhZGluZ1NwYWNlLCAwKTsKICAgICBvcGVyYXRvclRvcExlZnQgPSBjZWlsZWRJbnRQb2lu
dChvcGVyYXRvclRvcExlZnQpOwogICAgIExheW91dFBvaW50IGxlZnRHbHlwaE9yaWdpbihvcGVy
YXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExlZnQueSgpICsgbV9zdHJldGNoSGVpZ2h0QWJv
dmVCYXNlbGluZSk7Ci0gICAgTGF5b3V0UmVjdCBsZWZ0R2x5cGhQYWludFJlY3QgPSBwYWludEds
eXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmxlZnQoKSwgbGVmdEdseXBoT3JpZ2luLCBUcmltUmln
aHQpOworICAgIExheW91dFJlY3QgbGVmdEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZv
LCBtX2Fzc2VtYmx5LmxlZnQsIGxlZnRHbHlwaE9yaWdpbiwgVHJpbVJpZ2h0KTsKIAotICAgIEZs
b2F0UmVjdCByaWdodEdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEu
cmlnaHQoKSk7CisgICAgRmxvYXRSZWN0IHJpZ2h0R2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlw
aChtX2Fzc2VtYmx5LnJpZ2h0KTsKICAgICBMYXlvdXRQb2ludCByaWdodEdseXBoT3JpZ2luKG9w
ZXJhdG9yVG9wTGVmdC54KCkgKyBvZmZzZXRXaWR0aCgpIC0gcmlnaHRHbHlwaEJvdW5kcy53aWR0
aCgpLCBvcGVyYXRvclRvcExlZnQueSgpICsgbV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSk7
Ci0gICAgTGF5b3V0UmVjdCByaWdodEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBt
X3N0cmV0Y2h5RGF0YS5yaWdodCgpLCByaWdodEdseXBoT3JpZ2luLCBUcmltTGVmdCk7CisgICAg
TGF5b3V0UmVjdCByaWdodEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2Vt
Ymx5LnJpZ2h0LCByaWdodEdseXBoT3JpZ2luLCBUcmltTGVmdCk7CiAKLSAgICBpZiAobV9zdHJl
dGNoeURhdGEubWlkZGxlKCkuZ2x5cGgpIHsKKyAgICBpZiAobV9hc3NlbWJseS5taWRkbGUuaXNW
YWxpZCgpKSB7CiAgICAgICAgIC8vIENlbnRlciB0aGUgZ2x5cGggb3JpZ2luIGJldHdlZW4gdGhl
IHN0YXJ0IGFuZCBlbmQgZ2x5cGggcGFpbnQgZXh0ZW50cy4KICAgICAgICAgTGF5b3V0UG9pbnQg
bWlkZGxlR2x5cGhPcmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwgbGVmdEdseXBoT3JpZ2luLnko
KSk7CiAgICAgICAgIG1pZGRsZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgocmlnaHRH
bHlwaFBhaW50UmVjdC54KCkgLSBsZWZ0R2x5cGhQYWludFJlY3QubWF4WCgpKSAvIDIuMCwgMCkp
OwotICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChp
bmZvLCBtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1MZWZ0
QW5kUmlnaHQpOworICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFp
bnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5Lm1pZGRsZSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1M
ZWZ0QW5kUmlnaHQpOwogICAgICAgICBmaWxsV2l0aEhvcml6b250YWxFeHRlbnNpb25HbHlwaChp
bmZvLCBsZWZ0R2x5cGhQYWludFJlY3QubWF4WE1pbllDb3JuZXIoKSwgbWlkZGxlR2x5cGhQYWlu
dFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgICAgIGZpbGxXaXRoSG9yaXpvbnRhbEV4dGVu
c2lvbkdseXBoKGluZm8sIG1pZGRsZUdseXBoUGFpbnRSZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJp
Z2h0R2x5cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgfSBlbHNlCkBAIC05Mzks
NyArOTE2LDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jpem9udGFsR2x5
cGhBc3NlbWJseShQYWludEluZm8mIGluZm8sIGNvbnN0IEwKIHZvaWQgUmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OnBhaW50Q2hpbGRyZW4oUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBv
aW50JiBwYWludE9mZnNldCwgUGFpbnRJbmZvJiBwYWludEluZm9Gb3JDaGlsZCwgYm9vbCB1c2VQ
cmludFJlY3QpCiB7CiAgICAgLy8gV2Ugc2tpcCBwYWludGluZyBmb3IgaW52aXNpYmxlIG9wZXJh
dG9ycyB0b28gdG8gYXZvaWQgc29tZSAibWlzc2luZyBjaGFyYWN0ZXIiIGdseXBoIHRvIGFwcGVh
ciBpZiBhcHByb3ByaWF0ZSBtYXRoIGZvbnRzIGFyZSBub3QgYXZhaWxhYmxlLgotICAgIGlmICht
X3N0cmV0Y2h5RGF0YS5tb2RlKCkgIT0gRHJhd05vcm1hbCB8fCBpc0ludmlzaWJsZU9wZXJhdG9y
KCkpCisgICAgaWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNoZWQgfHwgaXNJbnZpc2libGVP
cGVyYXRvcigpKQogICAgICAgICByZXR1cm47CiAgICAgUmVuZGVyTWF0aE1MVG9rZW46OnBhaW50
Q2hpbGRyZW4ocGFpbnRJbmZvLCBwYWludE9mZnNldCwgcGFpbnRJbmZvRm9yQ2hpbGQsIHVzZVBy
aW50UmVjdCk7CiB9CkBAIC05NTQsMTkgKzkzMSwxOSBAQCBMYXlvdXRVbml0IFJlbmRlck1hdGhN
TE9wZXJhdG9yOjp0cmFpbGluZ1NwYWNlRXJyb3IoKQogICAgIC8vIEhlbmNlIHdlIGRldGVybWlu
ZSB0aGUgZXJyb3IgaW4gdGhlIGxvZ2ljYWwgd2lkdGggd2l0aCByZXNwZWN0IHRvIHRoZSBhY3R1
YWwgd2lkdGggb2YgdGhlIGdseXBoKHMpIHVzZWQgdG8gcGFpbnQgdGhlIG9wZXJhdG9yLgogICAg
IExheW91dFVuaXQgd2lkdGggPSBsb2dpY2FsV2lkdGgoKTsKIAotICAgIGlmIChtX3N0cmV0Y2h5
RGF0YS5tb2RlKCkgPT0gRHJhd05vcm1hbCkgeworICAgIGlmIChtX3N0cmV0Y2hUeXBlID09IFVu
c3RyZXRjaGVkKSB7CiAgICAgICAgIEdseXBoRGF0YSBkYXRhID0gc3R5bGUoKS5mb250Q2FzY2Fk
ZSgpLmdseXBoRGF0YUZvckNoYXJhY3Rlcih0ZXh0Q29udGVudCgpLCAhc3R5bGUoKS5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkpOwogICAgICAgICByZXR1cm4gd2lkdGggLSBhZHZhbmNlV2lkdGhG
b3JHbHlwaChkYXRhKTsKICAgICB9CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEubW9kZSgpID09
IERyYXdTaXplVmFyaWFudCkKLSAgICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5jZVdpZHRoRm9y
R2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgpKTsKKyAgICBpZiAobV9zdHJldGNoVHlwZSA9
PSBTaXplVmFyaWFudCkKKyAgICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5jZVdpZHRoRm9yR2x5
cGgobV92YXJpYW50KTsKIAotICAgIGZsb2F0IGFzc2VtYmx5V2lkdGggPSBhZHZhbmNlV2lkdGhG
b3JHbHlwaChtX3N0cmV0Y2h5RGF0YS50b3AoKSk7Ci0gICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6
bWF4KGFzc2VtYmx5V2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmJv
dHRvbSgpKSk7Ci0gICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgsIGFk
dmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpKSk7Ci0gICAgaWYg
KG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLmdseXBoKQotICAgICAgICBhc3NlbWJseVdpZHRoID0g
c3RkOjptYXgoYXNzZW1ibHlXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURh
dGEubWlkZGxlKCkpKTsKKyAgICBmbG9hdCBhc3NlbWJseVdpZHRoID0gYWR2YW5jZVdpZHRoRm9y
R2x5cGgobV9hc3NlbWJseS50b3ApOworICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3Nl
bWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5LmJvdHRvbSkpOworICAg
IGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JH
bHlwaChtX2Fzc2VtYmx5LmV4dGVuc2lvbikpOworICAgIGlmIChtX2Fzc2VtYmx5Lm1pZGRsZS5p
c1ZhbGlkKCkpCisgICAgICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRo
LCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5Lm1pZGRsZSkpOwogICAgIHJldHVybiB3
aWR0aCAtIGFzc2VtYmx5V2lkdGg7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaAppbmRleCAzMmMxMWE0Li5iNDA4
NTJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1h
dGhNTE9wZXJhdG9yLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5k
ZXJNYXRoTUxPcGVyYXRvci5oCkBAIC01MSw3ICs1MSw3IEBAIHB1YmxpYzoKICAgICAvLyBGSVhN
RTogVGhlIGRpc3BsYXlzdHlsZSBwcm9wZXJ0eSBpcyBub3QgaW1wbGVtZW50ZWQgKGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTg3MzcpLgogICAgIGJvb2wgaXNMYXJn
ZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSBjb25zdCB7IHJldHVybiAhaGFzT3BlcmF0b3JGbGFn
KE1hdGhNTE9wZXJhdG9yRGljdGlvbmFyeTo6U3RyZXRjaHkpICYmIGhhc09wZXJhdG9yRmxhZyhN
YXRoTUxPcGVyYXRvckRpY3Rpb25hcnk6OkxhcmdlT3ApOyB9CiAgICAgYm9vbCBpc1ZlcnRpY2Fs
KCkgY29uc3QgeyByZXR1cm4gbV9pc1ZlcnRpY2FsOyB9Ci0gICAgTGF5b3V0VW5pdCBpdGFsaWND
b3JyZWN0aW9uKCkgY29uc3Q7CisgICAgTGF5b3V0VW5pdCBpdGFsaWNDb3JyZWN0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pdGFsaWNDb3JyZWN0aW9uOyB9CiAKICAgICB2b2lkIHN0eWxlRGlkQ2hh
bmdlKFN0eWxlRGlmZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKSBmaW5hbDsK
ICAgICB2b2lkIHVwZGF0ZVN0eWxlKCkgZmluYWw7CkBAIC03Myw2MCArNzMsMzEgQEAgcHJvdGVj
dGVkOgogICAgIFVDaGFyIHRleHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVu
dDsgfQogCiBwcml2YXRlOgotICAgIGVudW0gRHJhd01vZGUgewotICAgICAgICBEcmF3Tm9ybWFs
LCBEcmF3U2l6ZVZhcmlhbnQsIERyYXdHbHlwaEFzc2VtYmx5CisgICAgc3RydWN0IEdseXBoQXNz
ZW1ibHlEYXRhIHsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgR2x5cGhEYXRhIHRvcDsK
KyAgICAgICAgICAgIEdseXBoRGF0YSByaWdodDsKKyAgICAgICAgfTsKKyAgICAgICAgR2x5cGhE
YXRhIGV4dGVuc2lvbjsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgR2x5cGhEYXRhIGJv
dHRvbTsKKyAgICAgICAgICAgIEdseXBoRGF0YSBsZWZ0OworICAgICAgICB9OworICAgICAgICBH
bHlwaERhdGEgbWlkZGxlOworICAgIEdseXBoQXNzZW1ibHlEYXRhKCkKKyAgICA6IHRvcCgpLCBl
eHRlbnNpb24oKSwgYm90dG9tKCksIG1pZGRsZSgpIHsgfQogICAgIH07Ci0KLSAgICBjbGFzcyBT
dHJldGNoeURhdGEgewotICAgIHB1YmxpYzoKLSAgICAgICAgRHJhd01vZGUgbW9kZSgpIGNvbnN0
IHsgcmV0dXJuIG1fbW9kZTsgfQotICAgICAgICBHbHlwaERhdGEgdmFyaWFudCgpIGNvbnN0IHsg
cmV0dXJuIG1fZGF0YVswXTsgfQotICAgICAgICBHbHlwaERhdGEgdG9wKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhWzBdOyB9Ci0gICAgICAgIEdseXBoRGF0YSBleHRlbnNpb24oKSBjb25zdCB7IHJl
dHVybiBtX2RhdGFbMV07IH0KLSAgICAgICAgR2x5cGhEYXRhIGJvdHRvbSgpIGNvbnN0IHsgcmV0
dXJuIG1fZGF0YVsyXTsgfQotICAgICAgICBHbHlwaERhdGEgbWlkZGxlKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhWzNdOyB9Ci0gICAgICAgIEdseXBoRGF0YSBsZWZ0KCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhWzJdOyB9Ci0gICAgICAgIEdseXBoRGF0YSByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YVswXTsgfQotCi0gICAgICAgIHZvaWQgc2V0Tm9ybWFsTW9kZSgpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIG1fbW9kZSA9IERyYXdOb3JtYWw7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBz
ZXRTaXplVmFyaWFudE1vZGUoY29uc3QgR2x5cGhEYXRhJiB2YXJpYW50KQotICAgICAgICB7Ci0g
ICAgICAgICAgICBtX21vZGUgPSBEcmF3U2l6ZVZhcmlhbnQ7Ci0gICAgICAgICAgICBtX2RhdGFb
MF0gPSB2YXJpYW50OwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0R2x5cGhBc3NlbWJseU1v
ZGUoY29uc3QgR2x5cGhEYXRhJiB0b3AsIGNvbnN0IEdseXBoRGF0YSYgZXh0ZW5zaW9uLCBjb25z
dCBHbHlwaERhdGEmIGJvdHRvbSwgY29uc3QgR2x5cGhEYXRhJiBtaWRkbGUpCi0gICAgICAgIHsK
LSAgICAgICAgICAgIG1fbW9kZSA9IERyYXdHbHlwaEFzc2VtYmx5OwotICAgICAgICAgICAgbV9k
YXRhWzBdID0gdG9wOwotICAgICAgICAgICAgbV9kYXRhWzFdID0gZXh0ZW5zaW9uOwotICAgICAg
ICAgICAgbV9kYXRhWzJdID0gYm90dG9tOwotICAgICAgICAgICAgbV9kYXRhWzNdID0gbWlkZGxl
OwotICAgICAgICB9Ci0gICAgICAgIFN0cmV0Y2h5RGF0YSgpCi0gICAgICAgICAgICA6IG1fbW9k
ZShEcmF3Tm9ybWFsKSB7IH0KLSAgICAgICAgU3RyZXRjaHlEYXRhKGNvbnN0IFN0cmV0Y2h5RGF0
YSYgZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChkYXRhLm1fbW9kZSkgewot
ICAgICAgICAgICAgY2FzZSBEcmF3Tm9ybWFsOgotICAgICAgICAgICAgICAgIHNldE5vcm1hbE1v
ZGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRHJhd1NpemVW
YXJpYW50OgotICAgICAgICAgICAgICAgIHNldFNpemVWYXJpYW50TW9kZShkYXRhLnZhcmlhbnQo
KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERyYXdHbHlwaEFz
c2VtYmx5OgotICAgICAgICAgICAgICAgIHNldEdseXBoQXNzZW1ibHlNb2RlKGRhdGEudG9wKCks
IGRhdGEuZXh0ZW5zaW9uKCksIGRhdGEuYm90dG9tKCksIGRhdGEubWlkZGxlKCkpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwcml2YXRl
OgotICAgICAgICBEcmF3TW9kZSBtX21vZGU7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3IgT3BlblR5
cGUgZm9udHMgd2l0aCBhIE1BVEggdGFibGUgYWxsIHRoZSBnbHlwaHMgYXJlIGZyb20gdGhlIHNh
bWUgZm9udCwgc28gd2Ugd291bGQgb25seSBuZWVkIHRvIHN0b3JlIHRoZSBnbHlwaCBpbmRpY2Vz
IGhlcmUuCi0gICAgICAgIEdseXBoRGF0YSBtX2RhdGFbNF07CisgICAgZW51bSBTdHJldGNoVHlw
ZSB7CisgICAgICAgIFVuc3RyZXRjaGVkLAorICAgICAgICBTaXplVmFyaWFudCwKKyAgICAgICAg
R2x5cGhBc3NlbWJseQorICAgIH07CisgICAgU3RyZXRjaFR5cGUgbV9zdHJldGNoVHlwZTsKKyAg
ICB1bmlvbiB7CisgICAgICAgIEdseXBoRGF0YSBtX3ZhcmlhbnQ7CisgICAgICAgIEdseXBoQXNz
ZW1ibHlEYXRhIG1fYXNzZW1ibHk7CiAgICAgfTsKKyAgICBMYXlvdXRVbml0IG1faXRhbGljQ29y
cmVjdGlvbjsKIAogICAgIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCBvdmVycmlkZSB7
IHJldHVybiBpc0Fub255bW91cygpID8gIlJlbmRlck1hdGhNTE9wZXJhdG9yIChhbm9ueW1vdXMp
IiA6ICJSZW5kZXJNYXRoTUxPcGVyYXRvciI7IH0KICAgICB2b2lkIHBhaW50Q2hpbGRyZW4oUGFp
bnRJbmZvJiBmb3JTZWxmLCBjb25zdCBMYXlvdXRQb2ludCYsIFBhaW50SW5mbyYgZm9yQ2hpbGQs
IGJvb2wgdXNlUHJpbnRSZWN0KSBmaW5hbDsKQEAgLTE0Miw5ICsxMTMsMTEgQEAgcHJpdmF0ZToK
ICAgICBib29sIHNob3VsZEFsbG93U3RyZXRjaGluZygpIGNvbnN0OwogCiAgICAgYm9vbCBnZXRC
YXNlR2x5cGgoY29uc3QgUmVuZGVyU3R5bGUmLCBHbHlwaERhdGEmKSBjb25zdDsKLSAgICBib29s
IGdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1i
bHlQYXJ0PiwgU3RyZXRjaHlEYXRhJikgY29uc3Q7Ci0gICAgU3RyZXRjaHlEYXRhIGdldERpc3Bs
YXlTdHlsZUxhcmdlT3BlcmF0b3IoKSBjb25zdDsKLSAgICBTdHJldGNoeURhdGEgZmluZFN0cmV0
Y2h5RGF0YShmbG9hdCogbWF4aW11bUdseXBoV2lkdGgpOworICAgIHZvaWQgc2V0U2l6ZVZhcmlh
bnQoY29uc3QgR2x5cGhEYXRhJik7CisgICAgdm9pZCBzZXRHbHlwaEFzc2VtYmx5KGNvbnN0IEds
eXBoQXNzZW1ibHlEYXRhJik7CisgICAgYm9vbCBnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVj
dG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4sIEdseXBoQXNzZW1ibHlEYXRhJikg
Y29uc3Q7CisgICAgdm9pZCBmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOworICAgIHZv
aWQgZmluZFN0cmV0Y2h5RGF0YShmbG9hdCogbWF4aW11bUdseXBoV2lkdGgsIExheW91dFVuaXQg
dGFyZ2V0U2l6ZSA9IDApOwogCiAgICAgZW51bSBHbHlwaFBhaW50VHJpbW1pbmcgewogICAgICAg
ICBUcmltVG9wLApAQCAtMTc2LDcgKzE0OSw2IEBAIHByaXZhdGU6CiAgICAgTGF5b3V0VW5pdCBt
X3RyYWlsaW5nU3BhY2U7CiAgICAgTGF5b3V0VW5pdCBtX21pblNpemU7CiAgICAgTGF5b3V0VW5p
dCBtX21heFNpemU7Ci0gICAgU3RyZXRjaHlEYXRhIG1fc3RyZXRjaHlEYXRhOwogfTsKIAogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQotLSAKMi44LjAucmMzCgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>278250</attachid>
            <date>2016-05-06 06:55:57 -0700</date>
            <delta_ts>2016-05-07 15:19:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-156913-20160506155638.patch</filename>
            <type>text/plain</type>
            <size>41729</size>
            <attacher name="Frédéric Wang Nélar">fred.wang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAwNTEwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOTllNGYyN2E5MDdhZDdi
ZTU0OTRlYTU4MWRmYjVlNTgwZjA2NTlkZi4uZGQyZmQzOTk5MjMyYWY2ZjUxNDMxM2JlNDFjMzYx
ZGFkYzZlZjFjZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDE2LTA1LTA2ICBGcmVk
ZXJpYyBXYW5nICA8ZndhbmdAaWdhbGlhLmNvbT4KKworICAgICAgICBSZW5kZXJNYXRoTUxPcGVy
YXRvcjogcmVmYWN0b3IgbWFuYWdlbWVudCBvZiBzdHJldGNoeSBkYXRhIGFuZCBpdGFsaWMgY29y
cmVjdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTU2OTEzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLCBiZWhhdmlvciBpcyBub3QgY2hhbmdlZC4KKworICAgICAgICBUaGUgc3Ry
ZXRjaHkgZGF0YSB1c2VzIGEgc2hhcmVkIHNwYWNlIHRvIGRlc2NyaWJlIGhvcml6b250YWwgLyB2
ZXJ0aWNhbCBkaXJlY3Rpb25zIGFuZAorICAgICAgICB1bnN0cmV0Y2hlZCAvIHNpemUgdmFyaWFu
dCAvIGdseXBoIGFzc2VtYmx5LiBXZSB1c2UgYSBzaW1wbGUgc3RydWN0IHdpdGggc29tZSB1bmlv
bnMgdG8KKyAgICAgICAgcmVwcmVzZW50IGl0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgaW1wbGVt
ZW50YXRpb24gd2l0aCBhIGNsYXNzLgorICAgICAgICBXZSBhbHNvIG1vZGlmeSB0aGUgc2lnbmF0
dXJlIG9mIHNvbWUgZnVuY3Rpb25zIHRvIHJldHJpZXZlIGRpc3BsYXkgb3BlcmF0b3IgYW5kIHN0
cmV0Y2h5CisgICAgICAgIGRhdGEgdG8gdXNlIHRoYXQgbmV3IHN0cnVjdHVyZSBhbmQgcHJlcGFy
ZSB0aGUgbW92ZSB0byBhIHNlcGFyYXRlIE1hdGhPcGVyYXRvciBjbGFzcy4KKyAgICAgICAgRmlu
YWxseSwgd2UgaW50cm9kdWNlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBlYXNpbHkgc2V0IHRo
ZSBzdHJldGNoeSBkYXRhLgorCisgICAgICAgICogcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRo
TUxPcGVyYXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
Y29tcHV0ZVByZWZlcnJlZExvZ2ljYWxXaWR0aHMpOiBVc2UgdGhlIG5ldyBkYXRhIG1lbWJlcnMg
YW5kCisgICAgICAgIGZ1bmN0aW9uIHNpZ25hdHVyZXMuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJNYXRoTUxPcGVyYXRvcjo6c2V0U2l6ZVZhcmlhbnQpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRv
IHNldCBhIHNpemUgdmFyaWFudC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJh
dG9yOjpzZXRHbHlwaEFzc2VtYmx5KTogTmV3IGhlbHBlciBmdW5jdGlvbiB0byBzZXQgYSBnbHlw
aAorICAgICAgICBhc3NlbWJseS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJh
dG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2spOiBXZSBjaGFuZ2UgdGhlIHNpZ25hdHVyZSB0
byB1c2UgYQorICAgICAgICBHbHlwaEFzc2VtYmx5RGF0YS4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlck1hdGhNTE9wZXJhdG9yOjpmaW5kRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcik6IFdlIHJl
bmFtZSB0aGUgZnVuY3Rpb24gYW5kCisgICAgICAgIGNoYW5nZSBpdHMgc2lnbmF0dXJlIHRvIHJl
bW92ZSB0aGUgcmV0dXJuIHZhbHVlLiBXZSBub3cgYWxzbyBzZXQgdGhlIGl0YWxpYyBjb3JyZWN0
aW9uIHdoZW4KKyAgICAgICAgYSBkaXNwbGF5IG9wZXJhdG9yIGlzIGZvdW5kLgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbmRTdHJldGNoeURhdGEpOiBXZSBjaGFu
Z2UgdGhlIHNpZ25hdHVyZSB0byBpbnRyb2R1Y2UgYQorICAgICAgICB0YXJnZXQgc2l6ZSBhbmQg
cmVtb3ZlIHRoZSByZXR1cm4gdmFsdWUuIFRoaXMgYWxzbyBkb2VzIHRoZSBlYXJseSByZXR1cm4g
d2hlbiB0aGUgYmFzZSBnbHlwaAorICAgICAgICBpcyBsYXJnZSBlbm91Z2guCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUpOiBXZSB1c2UgdGhlIG5l
dyBkYXRhIG1lbWJlcnMgYW5kIGZ1bmN0aW9uCisgICAgICAgIHNpZ25hdHVyZXMuIFRoZSBjaGVj
ayBmb3IgdGhlIGJhc2UgZ2x5cGggc2l6ZSBpcyBub3cgZG9uZSBpbiBmaW5kU3RyZXRjaHlEYXRh
LCBzbyB3ZSBqdXN0CisgICAgICAgIGNoZWNrIHdoZXRoZXIgbV9zdHJldGNoVHlwZSBpcyBVbnN0
cmV0Y2hlZCB0byBkbyBhbiBlYXJseSByZXR1cm4uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJN
YXRoTUxPcGVyYXRvcjo6Zmlyc3RMaW5lQmFzZWxpbmUpOiBXZSB1c2UgbV9zdHJldGNoVHlwZS4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpjb21wdXRlTG9naWNhbEhl
aWdodCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZp
bGxXaXRoVmVydGljYWxFeHRlbnNpb25HbHlwaCk6IFVzZSB0aGUgbmV3IGNsYXNzIG1lbWJlcnMu
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhIb3Jpem9u
dGFsRXh0ZW5zaW9uR2x5cGgpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhN
TE9wZXJhdG9yOjpwYWludCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1M
T3BlcmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFzc2VtYmx5KTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jpem9udGFsR2x5cGhBc3NlbWJs
eSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50
Q2hpbGRyZW4pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9y
Ojp0cmFpbGluZ1NwYWNlRXJyb3IpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1h
dGhNTE9wZXJhdG9yOjppdGFsaWNDb3JyZWN0aW9uKTogTW92ZWQgdG8gUmVuZGVyTWF0aE1MT3Bl
cmF0b3IuaC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXREaXNw
bGF5U3R5bGVMYXJnZU9wZXJhdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvbWF0
aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRo
TUxPcGVyYXRvcjo6aXRhbGljQ29ycmVjdGlvbik6IFdlIGp1c3QgcmV0dXJuIG1faXRhbGljQ29y
cmVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpHbHlwaEFz
c2VtYmx5RGF0YTo6R2x5cGhBc3NlbWJseURhdGEpOiBOZXcgY2xhc3MgdG8gc3RvcmUgYW4KKyAg
ICAgICAgYXNzZW1ibHkgb2YgR2x5cGhEYXRhLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0
aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6bW9kZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhOjp2YXJpYW50KTogRGVsZXRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6
OnRvcCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
U3RyZXRjaHlEYXRhOjpleHRlbnNpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0YTo6Ym90dG9tKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6Om1pZGRsZSk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRj
aHlEYXRhOjpsZWZ0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9w
ZXJhdG9yOjpTdHJldGNoeURhdGE6OnJpZ2h0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnNldE5vcm1hbE1vZGUpOiBEZWxl
dGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5RGF0
YTo6c2V0U2l6ZVZhcmlhbnRNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURhdGE6OnNldEdseXBoQXNzZW1ibHlNb2RlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJldGNoeURh
dGE6OlN0cmV0Y2h5RGF0YSk6IERlbGV0ZWQuCisKIDIwMTYtMDUtMDYgIE1hbnVlbCBSZWdvIENh
c2Fzbm92YXMgIDxyZWdvQGlnYWxpYS5jb20+CiAKICAgICAgICAgW2Nzcy1ncmlkXSBVbnByZWZp
eCBDU1MgR3JpZCBMYXlvdXQgcHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcAppbmRleCA4ODY3ZDE3
YzdjNGViNmYzMDQ5YzcyYzBlYjViNTkyNmI3NTQ0Y2I4Li43MDkzYjQ3NWRhNzA3YzU0MzlkNWMw
NzhjMDE5NTg0ZjliNmY4ZGZjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
bWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmNwcApAQCAtMjAyLDE4ICsyMDIsNiBA
QCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjppc0NoaWxkQWxsb3dlZChjb25zdCBSZW5kZXJP
YmplY3QmLCBjb25zdCBSZW5kZXJTdHlsZQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6aXRhbGljQ29ycmVjdGlvbigpIGNvbnN0Ci17Ci0g
ICAgaWYgKGlzTGFyZ2VPcGVyYXRvckluRGlzcGxheVN0eWxlKCkpIHsKLSAgICAgICAgY29uc3Qg
YXV0byYgcHJpbWFyeUZvbnQgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCkucHJpbWFyeUZvbnQoKTsK
LSAgICAgICAgaWYgKGF1dG8qIG1hdGhEYXRhID0gcHJpbWFyeUZvbnQubWF0aERhdGEoKSkgewot
ICAgICAgICAgICAgU3RyZXRjaHlEYXRhIGxhcmdlT3BlcmF0b3IgPSBnZXREaXNwbGF5U3R5bGVM
YXJnZU9wZXJhdG9yKCk7Ci0gICAgICAgICAgICByZXR1cm4gbWF0aERhdGEtPmdldEl0YWxpY0Nv
cnJlY3Rpb24ocHJpbWFyeUZvbnQsIGxhcmdlT3BlcmF0b3IudmFyaWFudCgpLmdseXBoKTsKLSAg
ICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogdm9pZCBSZW5kZXJNYXRoTUxPcGVy
YXRvcjo6c3RyZXRjaFRvKExheW91dFVuaXQgaGVpZ2h0QWJvdmVCYXNlbGluZSwgTGF5b3V0VW5p
dCBkZXB0aEJlbG93QmFzZWxpbmUpCiB7CiAgICAgQVNTRVJUKGhhc09wZXJhdG9yRmxhZyhNYXRo
TUxPcGVyYXRvckRpY3Rpb25hcnk6OlN0cmV0Y2h5KSk7CkBAIC0zMTcsMTIgKzMwNSwxMiBAQCB2
b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpjb21wdXRlUHJlZmVycmVkTG9naWNhbFdpZHRocygp
CiAgICAgfQogICAgIGlmIChpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKSB7CiAgICAg
ICAgIC8vIExhcmdlIG9wZXJhdG9ycyBpbiBTVElYIFdvcmQgaGF2ZSBpbmNvcnJlY3QgYWR2YW5j
ZSB3aWR0aCwgY2F1c2luZyBtaXNwbGFjZW1lbnQgb2Ygc3VwZXJzY3JpcHQsIHNvIHdlIHVzZSB0
aGUgZ2x5cGggYm91bmQgaW5zdGVhZCAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wL3N0aXhmb250
cy90cmFja2luZy80OS8pLgotICAgICAgICBTdHJldGNoeURhdGEgbGFyZ2VPcGVyYXRvciA9IGdl
dERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKLSAgICAgICAgaWYgKGxhcmdlT3BlcmF0b3Iu
bW9kZSgpID09IERyYXdTaXplVmFyaWFudCkKLSAgICAgICAgICAgIG1heGltdW1HbHlwaFdpZHRo
ID0gYm91bmRzRm9yR2x5cGgobGFyZ2VPcGVyYXRvci52YXJpYW50KCkpLndpZHRoKCk7CisgICAg
ICAgIGNhbGN1bGF0ZURpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKKyAgICAgICAgaWYgKG1f
c3RyZXRjaFR5cGUgPT0gU2l6ZVZhcmlhbnQpCisgICAgICAgICAgICBtYXhpbXVtR2x5cGhXaWR0
aCA9IGJvdW5kc0ZvckdseXBoKG1fdmFyaWFudCkud2lkdGgoKTsKICAgICB9IGVsc2UgewogICAg
ICAgICAvLyBGSVhNRTogc29tZSBnbHlwaHMgKGUuZy4gdGhlIG9uZSBmb3IgIkZSQUNUSU9OIFNM
QVNIIiBpbiB0aGUgU1RJWCBNYXRoIGZvbnQgb3IgbGFyZ2Ugb3BlcmF0b3JzKSBoYXZlIGEgd2lk
dGggdGhhdCBkZXBlbmRzIG9uIHRoZSBoZWlnaHQsIHJlc3VsdGluZyBpbiBsYXJnZSBnYXBzICho
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMzI2KS4KLSAgICAgICAg
ZmluZFN0cmV0Y2h5RGF0YSgmbWF4aW11bUdseXBoV2lkdGgpOworICAgICAgICBjYWxjdWxhdGVT
dHJldGNoeURhdGEoJm1heGltdW1HbHlwaFdpZHRoKTsKICAgICB9CiAgICAgbV9tYXhQcmVmZXJy
ZWRMb2dpY2FsV2lkdGggPSBtX21pblByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IG1fbGVhZGluZ1Nw
YWNlICsgbWF4aW11bUdseXBoV2lkdGggKyBtX3RyYWlsaW5nU3BhY2U7CiB9CkBAIC0zOTIsMTMg
KzM4MCwyMSBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRCYXNlR2x5cGgoY29uc3Qg
UmVuZGVyU3R5bGUmIHN0eWxlLCBHbHlwaERhdGEmIGJhcwogICAgIHJldHVybiBiYXNlR2x5cGgu
aXNWYWxpZCgpICYmIGJhc2VHbHlwaC5mb250ID09ICZzdHlsZS5mb250Q2FzY2FkZSgpLnByaW1h
cnlGb250KCk7CiB9CiAKLWJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldEdseXBoQXNzZW1i
bHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0PiBhc3NlbWJs
eVBhcnRzLCBTdHJldGNoeURhdGEmIHN0cmV0Y2h5RGF0YSkgY29uc3QKK3ZvaWQgUmVuZGVyTWF0
aE1MT3BlcmF0b3I6OnNldFNpemVWYXJpYW50KGNvbnN0IEdseXBoRGF0YSYgc2l6ZVZhcmlhbnQp
CiB7Ci0gICAgR2x5cGhEYXRhIHRvcDsKLSAgICBHbHlwaERhdGEgZXh0ZW5zaW9uOwotICAgIEds
eXBoRGF0YSBib3R0b207Ci0gICAgR2x5cGhEYXRhIG1pZGRsZTsKKyAgICBBU1NFUlQoc2l6ZVZh
cmlhbnQuaXNWYWxpZCgpICYmIHNpemVWYXJpYW50LmZvbnQtPm1hdGhEYXRhKCkpOworICAgIG1f
c3RyZXRjaFR5cGUgPSBTaXplVmFyaWFudDsKKyAgICBtX3ZhcmlhbnQgPSBzaXplVmFyaWFudDsK
K30KIAordm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6c2V0R2x5cGhBc3NlbWJseShjb25zdCBH
bHlwaEFzc2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKQoreworICAgIG1fc3RyZXRjaFR5cGUgPSBH
bHlwaEFzc2VtYmx5OworICAgIG1fYXNzZW1ibHkgPSBhc3NlbWJseURhdGE7Cit9CisKK2Jvb2wg
UmVuZGVyTWF0aE1MT3BlcmF0b3I6OmNhbGN1bGF0ZUdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0
b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNzZW1ibHlQYXJ0PiBhc3NlbWJseVBhcnRzLCBHbHlwaEFz
c2VtYmx5RGF0YSYgYXNzZW1ibHlEYXRhKSBjb25zdAorewogICAgIC8vIFRoZSBzdHJ1Y3R1cmUg
b2YgdGhlIE9wZW4gVHlwZSBNYXRoIHRhYmxlIGlzIGEgYml0IG1vcmUgZ2VuZXJhbCB0aGFuIHRo
ZSBvbmUgY3VycmVudGx5IHVzZWQgYnkgdGhlIFJlbmRlck1hdGhNTE9wZXJhdG9yIGNvZGUsIHNv
IHdlIHRyeSB0byBmYWxsYmFjayBpbiBhIHJlYXNvbmFibGUgd2F5LgogICAgIC8vIEZJWE1FOiBS
ZW5kZXJNYXRoTUxPcGVyYXRvciBzaG91bGQgc3VwcG9ydCB0aGUgbW9zdCBnZW5lcmFsIGZvcm1h
dCAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMDMyNykuCiAgICAg
Ly8gV2UgdXNlIHRoZSBhcHByb2FjaCBvZiB0aGUgY29weUNvbXBvbmVudHMgZnVuY3Rpb24gaW4g
Z2l0aHViLmNvbS9tYXRoamF4L01hdGhKYXgtZGV2L2Jsb2IvbWFzdGVyL2ZvbnRzL09wZW5UeXBl
TWF0aC9mb250VXRpbC5weQpAQCAtNDIyLDggKzQxOCw4IEBAIGJvb2wgUmVuZGVyTWF0aE1MT3Bl
cmF0b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6
QXNzCiAgICAgICAgIE5vbmUKICAgICB9OwogICAgIFBhcnRUeXBlIGV4cGVjdGVkUGFydFR5cGUg
PSBTdGFydDsKLSAgICBleHRlbnNpb24uZ2x5cGggPSAwOwotICAgIG1pZGRsZS5nbHlwaCA9IDA7
CisgICAgYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlwaCA9IDA7CisgICAgYXNzZW1ibHlEYXRh
Lm1pZGRsZS5nbHlwaCA9IDA7CiAgICAgZm9yIChhdXRvJiBwYXJ0IDogYXNzZW1ibHlQYXJ0cykg
ewogICAgICAgICBpZiAobm9uRXh0ZW5kZXJDb3VudCA8IDMpIHsKICAgICAgICAgICAgIC8vIElm
IHdlIG9ubHkgaGF2ZSBhdCBtb3N0IHR3byBub24tZXh0ZW5kZXJzIHRoZW4gd2Ugc2tpcCB0aGUg
bWlkZGxlIGdseXBoLgpAQCAtNDMzLDkgKzQyOSw5IEBAIGJvb2wgUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNz
CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYXJ0VHlwZSA9IEVuZDsKICAgICAgICAgfQogICAg
ICAgICBpZiAocGFydC5pc0V4dGVuZGVyKSB7Ci0gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5n
bHlwaCkKLSAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2x5cGggPSBwYXJ0LmdseXBoOyAvLyBX
ZSBjb3B5IHRoZSBleHRlbmRlciBwYXJ0LgotICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9u
LmdseXBoICE9IHBhcnQuZ2x5cGgpCisgICAgICAgICAgICBpZiAoIWFzc2VtYmx5RGF0YS5leHRl
bnNpb24uZ2x5cGgpCisgICAgICAgICAgICAgICAgYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlw
aCA9IHBhcnQuZ2x5cGg7IC8vIFdlIGNvcHkgdGhlIGV4dGVuZGVyIHBhcnQuCisgICAgICAgICAg
ICBlbHNlIGlmIChhc3NlbWJseURhdGEuZXh0ZW5zaW9uLmdseXBoICE9IHBhcnQuZ2x5cGgpCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IHRo
ZSBhc3NlbWJseSBoYXMgZGlmZmVyZW50IGV4dGVuZGVycy4KIAogICAgICAgICAgICAgc3dpdGNo
IChleHBlY3RlZFBhcnRUeXBlKSB7CkBAIC00NjEsMTkgKzQ1NywxOSBAQCBib29sIFJlbmRlck1h
dGhNTE9wZXJhdG9yOjpnZXRHbHlwaEFzc2VtYmx5RmFsbEJhY2soVmVjdG9yPE9wZW5UeXBlTWF0
aERhdGE6OkFzcwogICAgICAgICBzd2l0Y2ggKGV4cGVjdGVkUGFydFR5cGUpIHsKICAgICAgICAg
Y2FzZSBTdGFydDoKICAgICAgICAgICAgIC8vIFdlIGNvcHkgdGhlIGxlZnQvYm90dG9tIHBhcnQu
Ci0gICAgICAgICAgICBib3R0b20uZ2x5cGggPSBwYXJ0LmdseXBoOworICAgICAgICAgICAgYXNz
ZW1ibHlEYXRhLmJvdHRvbS5nbHlwaCA9IHBhcnQuZ2x5cGg7CiAgICAgICAgICAgICBleHBlY3Rl
ZFBhcnRUeXBlID0gRXh0ZW5kZXJCZXR3ZWVuU3RhcnRBbmRNaWRkbGU7CiAgICAgICAgICAgICBj
b250aW51ZTsKICAgICAgICAgY2FzZSBFeHRlbmRlckJldHdlZW5TdGFydEFuZE1pZGRsZToKICAg
ICAgICAgY2FzZSBNaWRkbGU6CiAgICAgICAgICAgICAvLyBXZSBjb3B5IHRoZSBtaWRkbGUgcGFy
dC4KLSAgICAgICAgICAgIG1pZGRsZS5nbHlwaCA9IHBhcnQuZ2x5cGg7CisgICAgICAgICAgICBh
c3NlbWJseURhdGEubWlkZGxlLmdseXBoID0gcGFydC5nbHlwaDsKICAgICAgICAgICAgIGV4cGVj
dGVkUGFydFR5cGUgPSBFeHRlbmRlckJldHdlZW5NaWRkbGVBbmRFbmQ7CiAgICAgICAgICAgICBj
b250aW51ZTsKICAgICAgICAgY2FzZSBFeHRlbmRlckJldHdlZW5NaWRkbGVBbmRFbmQ6CiAgICAg
ICAgIGNhc2UgRW5kOgogICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgcmlnaHQvdG9wIHBhcnQu
Ci0gICAgICAgICAgICB0b3AuZ2x5cGggPSBwYXJ0LmdseXBoOworICAgICAgICAgICAgYXNzZW1i
bHlEYXRhLnRvcC5nbHlwaCA9IHBhcnQuZ2x5cGg7CiAgICAgICAgICAgICBleHBlY3RlZFBhcnRU
eXBlID0gTm9uZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIE5vbmU6CkBA
IC00ODIsMzUgKzQ3OCwzMCBAQCBib29sIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpnZXRHbHlwaEFz
c2VtYmx5RmFsbEJhY2soVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzcwogICAgICAgICB9CiAg
ICAgfQogCi0gICAgaWYgKCFleHRlbnNpb24uZ2x5cGgpCisgICAgaWYgKCFhc3NlbWJseURhdGEu
ZXh0ZW5zaW9uLmdseXBoKQogICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgaXMgbm90IHN1
cHBvcnRlZDogd2UgYWx3YXlzIGFzc3VtZSB0aGF0IHdlIGhhdmUgYW4gZXh0ZW5zaW9uIGdseXBo
LgogCiAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0b3AvYm90dG9tIGdseXBocywgd2UgdXNlIHRo
ZSBleHRlbnNpb24gZ2x5cGguCi0gICAgaWYgKCF0b3AuZ2x5cGgpCi0gICAgICAgIHRvcC5nbHlw
aCA9IGV4dGVuc2lvbi5nbHlwaDsKLSAgICBpZiAoIWJvdHRvbS5nbHlwaCkKLSAgICAgICAgYm90
dG9tLmdseXBoID0gZXh0ZW5zaW9uLmdseXBoOworICAgIGlmICghYXNzZW1ibHlEYXRhLnRvcC5n
bHlwaCkKKyAgICAgICAgYXNzZW1ibHlEYXRhLnRvcC5nbHlwaCA9IGFzc2VtYmx5RGF0YS5leHRl
bnNpb24uZ2x5cGg7CisgICAgaWYgKCFhc3NlbWJseURhdGEuYm90dG9tLmdseXBoKQorICAgICAg
ICBhc3NlbWJseURhdGEuYm90dG9tLmdseXBoID0gYXNzZW1ibHlEYXRhLmV4dGVuc2lvbi5nbHlw
aDsKIAotICAgIHRvcC5mb250ID0gJnN0eWxlKCkuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgp
OwotICAgIGV4dGVuc2lvbi5mb250ID0gdG9wLmZvbnQ7Ci0gICAgYm90dG9tLmZvbnQgPSB0b3Au
Zm9udDsKLSAgICBpZiAobWlkZGxlLmdseXBoKQotICAgICAgICBtaWRkbGUuZm9udCA9IHRvcC5m
b250OwotCi0gICAgc3RyZXRjaHlEYXRhLnNldEdseXBoQXNzZW1ibHlNb2RlKHRvcCwgZXh0ZW5z
aW9uLCBib3R0b20sIG1pZGRsZSk7CisgICAgYXNzZW1ibHlEYXRhLnRvcC5mb250ID0gJnN0eWxl
KCkuZm9udENhc2NhZGUoKS5wcmltYXJ5Rm9udCgpOworICAgIGFzc2VtYmx5RGF0YS5leHRlbnNp
b24uZm9udCA9IGFzc2VtYmx5RGF0YS50b3AuZm9udDsKKyAgICBhc3NlbWJseURhdGEuYm90dG9t
LmZvbnQgPSBhc3NlbWJseURhdGEudG9wLmZvbnQ7CisgICAgYXNzZW1ibHlEYXRhLm1pZGRsZS5m
b250ID0gYXNzZW1ibHlEYXRhLm1pZGRsZS5nbHlwaCA/IGFzc2VtYmx5RGF0YS50b3AuZm9udCA6
IG51bGxwdHI7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotUmVuZGVyTWF0aE1MT3BlcmF0b3I6
OlN0cmV0Y2h5RGF0YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Z2V0RGlzcGxheVN0eWxlTGFyZ2VP
cGVyYXRvcigpIGNvbnN0Cit2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpjYWxjdWxhdGVEaXNw
bGF5U3R5bGVMYXJnZU9wZXJhdG9yKCkKIHsKLSAgICBTdHJldGNoeURhdGEgZGF0YTsKLQogICAg
IEFTU0VSVChtX2lzVmVydGljYWwgJiYgaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSk7
CiAKICAgICBHbHlwaERhdGEgYmFzZUdseXBoOwogICAgIGlmICghZ2V0QmFzZUdseXBoKHN0eWxl
KCksIGJhc2VHbHlwaCkgfHwgIWJhc2VHbHlwaC5mb250LT5tYXRoRGF0YSgpKQotICAgICAgICBy
ZXR1cm4gZGF0YTsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgVmVjdG9yPEdseXBoPiBzaXplVmFy
aWFudHM7CiAgICAgVmVjdG9yPE9wZW5UeXBlTWF0aERhdGE6OkFzc2VtYmx5UGFydD4gYXNzZW1i
bHlQYXJ0czsKQEAgLTUyMSw1MyArNTEyLDU0IEBAIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpTdHJl
dGNoeURhdGEgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmdldERpc3BsYXlTdHlsZUxhcmdlT3BlCiAg
ICAgYmFzZUdseXBoLmZvbnQtPm1hdGhEYXRhKCktPmdldE1hdGhWYXJpYW50cyhiYXNlR2x5cGgu
Z2x5cGgsIHRydWUsIHNpemVWYXJpYW50cywgYXNzZW1ibHlQYXJ0cyk7CiAKICAgICAvLyBXZSBj
aG9vc2UgdGhlIGZpcnN0IHNpemUgdmFyaWFudCB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBleHBl
Y3RlZCBkaXNwbGF5T3BlcmF0b3JNaW5IZWlnaHQgYW5kIG90aGVyd2lzZSBmYWxsYmFjayB0byB0
aGUgbGFyZ2VzdCB2YXJpYW50LgotICAgIGZvciAoYXV0byYgdmFyaWFudCA6IHNpemVWYXJpYW50
cykgewotICAgICAgICBHbHlwaERhdGEgc2l6ZVZhcmlhbnQ7Ci0gICAgICAgIHNpemVWYXJpYW50
LmdseXBoID0gdmFyaWFudDsKLSAgICAgICAgc2l6ZVZhcmlhbnQuZm9udCA9IGJhc2VHbHlwaC5m
b250OwotICAgICAgICBkYXRhLnNldFNpemVWYXJpYW50TW9kZShzaXplVmFyaWFudCk7Ci0gICAg
ICAgIGlmIChib3VuZHNGb3JHbHlwaChzaXplVmFyaWFudCkuaGVpZ2h0KCkgPj0gZGlzcGxheU9w
ZXJhdG9yTWluSGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgZm9yIChhdXRv
JiBzaXplVmFyaWFudCA6IHNpemVWYXJpYW50cykgeworICAgICAgICBHbHlwaERhdGEgZ2x5cGhE
YXRhKHNpemVWYXJpYW50LCBiYXNlR2x5cGguZm9udCk7CisgICAgICAgIHNldFNpemVWYXJpYW50
KGdseXBoRGF0YSk7CisgICAgICAgIG1faXRhbGljQ29ycmVjdGlvbiA9IGdseXBoRGF0YS5mb250
LT5tYXRoRGF0YSgpLT5nZXRJdGFsaWNDb3JyZWN0aW9uKCpnbHlwaERhdGEuZm9udCwgZ2x5cGhE
YXRhLmdseXBoKTsKKyAgICAgICAgaWYgKGhlaWdodEZvckdseXBoKGdseXBoRGF0YSkgPj0gZGlz
cGxheU9wZXJhdG9yTWluSGVpZ2h0KQorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJl
dHVybiBkYXRhOwogfQogCi1SZW5kZXJNYXRoTUxPcGVyYXRvcjo6U3RyZXRjaHlEYXRhIFJlbmRl
ck1hdGhNTE9wZXJhdG9yOjpmaW5kU3RyZXRjaHlEYXRhKGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0
aCkKK3ZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmNhbGN1bGF0ZVN0cmV0Y2h5RGF0YShmbG9h
dCogbWF4aW11bUdseXBoV2lkdGgsIExheW91dFVuaXQgdGFyZ2V0U2l6ZSkKIHsKICAgICBBU1NF
UlQoIW1heGltdW1HbHlwaFdpZHRoIHx8IG1faXNWZXJ0aWNhbCk7CiAKLSAgICBTdHJldGNoeURh
dGEgZGF0YTsKLSAgICBTdHJldGNoeURhdGEgYXNzZW1ibHlEYXRhOwotCiAgICAgR2x5cGhEYXRh
IGJhc2VHbHlwaDsKICAgICBpZiAoIWdldEJhc2VHbHlwaChzdHlsZSgpLCBiYXNlR2x5cGgpKQot
ICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgcmV0dXJuOwogICAgIAorICAgIGlmICghbWF4
aW11bUdseXBoV2lkdGgpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IHN0cmV0Y2ggaWYgdGhlIGJh
c2UgZ2x5cGggaXMgbGFyZ2UgZW5vdWdoLgorICAgICAgICBmbG9hdCBiYXNlU2l6ZSA9IG1faXNW
ZXJ0aWNhbCA/IGhlaWdodEZvckdseXBoKGJhc2VHbHlwaCkgOiBhZHZhbmNlV2lkdGhGb3JHbHlw
aChiYXNlR2x5cGgpOworICAgICAgICBpZiAodGFyZ2V0U2l6ZSA8PSBiYXNlU2l6ZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHbHlwaEFzc2VtYmx5RGF0YSBhc3NlbWJseURh
dGE7CiAgICAgaWYgKGJhc2VHbHlwaC5mb250LT5tYXRoRGF0YSgpKSB7CiAgICAgICAgIFZlY3Rv
cjxHbHlwaD4gc2l6ZVZhcmlhbnRzOwogICAgICAgICBWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6
QXNzZW1ibHlQYXJ0PiBhc3NlbWJseVBhcnRzOwogICAgICAgICBiYXNlR2x5cGguZm9udC0+bWF0
aERhdGEoKS0+Z2V0TWF0aFZhcmlhbnRzKGJhc2VHbHlwaC5nbHlwaCwgbV9pc1ZlcnRpY2FsLCBz
aXplVmFyaWFudHMsIGFzc2VtYmx5UGFydHMpOwogICAgICAgICAvLyBXZSB2ZXJpZnkgdGhlIHNp
emUgdmFyaWFudHMuCi0gICAgICAgIGZvciAoYXV0byYgdmFyaWFudCA6IHNpemVWYXJpYW50cykg
ewotICAgICAgICAgICAgR2x5cGhEYXRhIHNpemVWYXJpYW50OwotICAgICAgICAgICAgc2l6ZVZh
cmlhbnQuZ2x5cGggPSB2YXJpYW50OwotICAgICAgICAgICAgc2l6ZVZhcmlhbnQuZm9udCA9IGJh
c2VHbHlwaC5mb250OworICAgICAgICBmb3IgKGF1dG8mIHNpemVWYXJpYW50IDogc2l6ZVZhcmlh
bnRzKSB7CisgICAgICAgICAgICBHbHlwaERhdGEgZ2x5cGhEYXRhKHNpemVWYXJpYW50LCBiYXNl
R2x5cGguZm9udCk7CiAgICAgICAgICAgICBpZiAobWF4aW11bUdseXBoV2lkdGgpCi0gICAgICAg
ICAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRo
LCBhZHZhbmNlV2lkdGhGb3JHbHlwaChzaXplVmFyaWFudCkpOworICAgICAgICAgICAgICAgICpt
YXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5cGhXaWR0aCwgYWR2YW5jZVdp
ZHRoRm9yR2x5cGgoZ2x5cGhEYXRhKSk7CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBkYXRhLnNldFNpemVWYXJpYW50TW9kZShzaXplVmFyaWFudCk7Ci0gICAgICAgICAgICAg
ICAgZmxvYXQgc2l6ZSA9IG1faXNWZXJ0aWNhbCA/IGhlaWdodEZvckdseXBoKHNpemVWYXJpYW50
KSA6IGFkdmFuY2VXaWR0aEZvckdseXBoKHNpemVWYXJpYW50KTsKLSAgICAgICAgICAgICAgICBp
ZiAoc2l6ZSA+PSBzdHJldGNoU2l6ZSgpKSAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRh
dGE7CisgICAgICAgICAgICAgICAgc2V0U2l6ZVZhcmlhbnQoZ2x5cGhEYXRhKTsKKyAgICAgICAg
ICAgICAgICBmbG9hdCBzaXplID0gbV9pc1ZlcnRpY2FsID8gaGVpZ2h0Rm9yR2x5cGgoZ2x5cGhE
YXRhKSA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGdseXBoRGF0YSk7CisgICAgICAgICAgICAgICAg
aWYgKHNpemUgPj0gdGFyZ2V0U2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAg
ICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gV2UgdmVyaWZ5IGlmIHRoZXJlIGlz
IGEgY29uc3RydWN0aW9uLgotICAgICAgICBpZiAoIWdldEdseXBoQXNzZW1ibHlGYWxsQmFjayhh
c3NlbWJseVBhcnRzLCBhc3NlbWJseURhdGEpKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Cisg
ICAgICAgIGlmICghY2FsY3VsYXRlR2x5cGhBc3NlbWJseUZhbGxCYWNrKGFzc2VtYmx5UGFydHMs
IGFzc2VtYmx5RGF0YSkpCisgICAgICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgaWYgKCFtX2lzVmVydGljYWwpCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAg
ICAgIHJldHVybjsKIAogICAgICAgICAvLyBJZiB0aGUgZm9udCBkb2VzIG5vdCBoYXZlIGEgTUFU
SCB0YWJsZSwgd2UgZmFsbGJhY2sgdG8gdGhlIFVuaWNvZGUtb25seSBjb25zdHJ1Y3Rpb25zLgog
ICAgICAgICBjb25zdCBTdHJldGNoeUNoYXJhY3Rlciogc3RyZXRjaHlDaGFyYWN0ZXIgPSBudWxs
cHRyOwpAQCAtNTg1LDQ1ICs1NzcsMzIgQEAgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OlN0cmV0Y2h5
RGF0YSBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmluZFN0cmV0Y2h5RGF0YShmbG9hdCoKIAogICAg
ICAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhIHN0cmV0Y2h5IGNoYXJhY3RlciBzZXQgZm9yIHRo
aXMgY2hhcmFjdGVyLCB3ZSBkb24ndCBrbm93IGhvdyB0byBzdHJldGNoIGl0LgogICAgICAgICBp
ZiAoIXN0cmV0Y2h5Q2hhcmFjdGVyKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAg
ICAgICByZXR1cm47CiAKICAgICAgICAgLy8gV2UgY29udmVydCB0aGUgbGlzdCBvZiBVbmljb2Rl
IGNoYXJhY3RlcnMgaW50byBhIGxpc3Qgb2YgZ2x5cGggZGF0YS4KLSAgICAgICAgR2x5cGhEYXRh
IHRvcCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRj
aHlDaGFyYWN0ZXItPnRvcENoYXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIGV4dGVuc2lv
biA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlD
aGFyYWN0ZXItPmV4dGVuc2lvbkNoYXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIGJvdHRv
bSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlD
aGFyYWN0ZXItPmJvdHRvbUNoYXIsIGZhbHNlKTsKLSAgICAgICAgR2x5cGhEYXRhIG1pZGRsZTsK
LSAgICAgICAgaWYgKHN0cmV0Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFyKQotICAgICAgICAgICAg
bWlkZGxlID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3RlcihzdHJl
dGNoeUNoYXJhY3Rlci0+bWlkZGxlQ2hhciwgZmFsc2UpOwotICAgICAgICBhc3NlbWJseURhdGEu
c2V0R2x5cGhBc3NlbWJseU1vZGUodG9wLCBleHRlbnNpb24sIGJvdHRvbSwgbWlkZGxlKTsKKyAg
ICAgICAgYXNzZW1ibHlEYXRhLnRvcCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPnRvcENoYXIsIGZhbHNlKTsKKyAgICAgICAg
YXNzZW1ibHlEYXRhLmV4dGVuc2lvbiA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPmV4dGVuc2lvbkNoYXIsIGZhbHNlKTsKKyAg
ICAgICAgYXNzZW1ibHlEYXRhLmJvdHRvbSA9IHN0eWxlKCkuZm9udENhc2NhZGUoKS5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoc3RyZXRjaHlDaGFyYWN0ZXItPmJvdHRvbUNoYXIsIGZhbHNlKTsKKyAg
ICAgICAgYXNzZW1ibHlEYXRhLm1pZGRsZSA9IHN0cmV0Y2h5Q2hhcmFjdGVyLT5taWRkbGVDaGFy
ID8gc3R5bGUoKS5mb250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3RlcihzdHJldGNoeUNo
YXJhY3Rlci0+bWlkZGxlQ2hhciwgZmFsc2UpIDogR2x5cGhEYXRhKCk7CiAgICAgfQogCi0gICAg
QVNTRVJUKGFzc2VtYmx5RGF0YS5tb2RlKCkgPT0gRHJhd0dseXBoQXNzZW1ibHkpOwotCiAgICAg
Ly8gSWYgd2UgYXJlIG1lYXN1cmluZyB0aGUgbWF4aW11bSB3aWR0aCwgdmVyaWZ5IGVhY2ggY29t
cG9uZW50LgogICAgIGlmIChtYXhpbXVtR2x5cGhXaWR0aCkgewotICAgICAgICAqbWF4aW11bUds
eXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckds
eXBoKGFzc2VtYmx5RGF0YS50b3AoKSkpOwotICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBz
dGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5
RGF0YS5leHRlbnNpb24oKSkpOwotICAgICAgICBpZiAoYXNzZW1ibHlEYXRhLm1pZGRsZSgpLmds
eXBoKQotICAgICAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1H
bHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEubWlkZGxlKCkpKTsK
LSAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRo
LCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEuYm90dG9tKCkpKTsKLSAgICAgICAg
cmV0dXJuIGFzc2VtYmx5RGF0YTsKKyAgICAgICAgKm1heGltdW1HbHlwaFdpZHRoID0gc3RkOjpt
YXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChhc3NlbWJseURhdGEu
dG9wKSk7CisgICAgICAgICptYXhpbXVtR2x5cGhXaWR0aCA9IHN0ZDo6bWF4KCptYXhpbXVtR2x5
cGhXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmV4dGVuc2lvbikpOwor
ICAgICAgICAqbWF4aW11bUdseXBoV2lkdGggPSBzdGQ6Om1heCgqbWF4aW11bUdseXBoV2lkdGgs
IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpKTsKKyAgICAgICAgKm1h
eGltdW1HbHlwaFdpZHRoID0gc3RkOjptYXgoKm1heGltdW1HbHlwaFdpZHRoLCBhZHZhbmNlV2lk
dGhGb3JHbHlwaChhc3NlbWJseURhdGEuYm90dG9tKSk7CisgICAgICAgIHJldHVybjsKICAgICB9
CiAKICAgICAvLyBXZSBlbnN1cmUgdGhhdCB0aGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2ggdG8gYXZv
aWQgZ2x5cGggb3ZlcmxhcHMuCi0gICAgZmxvYXQgc2l6ZTsKLSAgICBpZiAobV9pc1ZlcnRpY2Fs
KSB7Ci0gICAgICAgIHNpemUgPSBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURhdGEudG9wKCkpICsg
aGVpZ2h0Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLmJvdHRvbSgpKTsKLSAgICAgICAgaWYgKGFzc2Vt
Ymx5RGF0YS5taWRkbGUoKS5nbHlwaCkKLSAgICAgICAgICAgIHNpemUgKz0gaGVpZ2h0Rm9yR2x5
cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplID0g
YWR2YW5jZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLmxlZnQoKSkgKyBhZHZhbmNlV2lkdGhG
b3JHbHlwaChhc3NlbWJseURhdGEucmlnaHQoKSk7Ci0gICAgICAgIGlmIChhc3NlbWJseURhdGEu
bWlkZGxlKCkuZ2x5cGgpCi0gICAgICAgICAgICBzaXplICs9IGFkdmFuY2VXaWR0aEZvckdseXBo
KGFzc2VtYmx5RGF0YS5taWRkbGUoKSk7Ci0gICAgfQotICAgIGlmIChzaXplID4gc3RyZXRjaFNp
emUoKSkKLSAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgZmxvYXQgbWluU2l6ZSA9IG1faXNWZXJ0
aWNhbCA/CisgICAgICAgIGhlaWdodEZvckdseXBoKGFzc2VtYmx5RGF0YS50b3ApICsgaGVpZ2h0
Rm9yR2x5cGgoYXNzZW1ibHlEYXRhLm1pZGRsZSkgKyBoZWlnaHRGb3JHbHlwaChhc3NlbWJseURh
dGEuYm90dG9tKQorICAgICAgICA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5s
ZWZ0KSArIGFkdmFuY2VXaWR0aEZvckdseXBoKGFzc2VtYmx5RGF0YS5taWRkbGUpICsgYWR2YW5j
ZVdpZHRoRm9yR2x5cGgoYXNzZW1ibHlEYXRhLnJpZ2h0KTsKKyAgICBpZiAobWluU2l6ZSA+IHRh
cmdldFNpemUpCisgICAgICAgIHJldHVybjsKIAotICAgIHJldHVybiBhc3NlbWJseURhdGE7Cisg
ICAgc2V0R2x5cGhBc3NlbWJseShhc3NlbWJseURhdGEpOwogfQogCiB2b2lkIFJlbmRlck1hdGhN
TE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCkBAIC02MzIsNyArNjExLDggQEAgdm9pZCBSZW5kZXJN
YXRoTUxPcGVyYXRvcjo6dXBkYXRlU3R5bGUoKQogICAgIGlmICghZmlyc3RDaGlsZCgpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICBtX3N0cmV0Y2h5RGF0YS5zZXROb3JtYWxNb2RlKCk7CisgICAg
bV9zdHJldGNoVHlwZSA9IFVuc3RyZXRjaGVkOworICAgIG1faXRhbGljQ29ycmVjdGlvbiA9IDA7
CiAgICAgLy8gV2UgYWRkIHNwYWNpbmcgYXJvdW5kIHRoZSBvcGVyYXRvci4KICAgICAvLyBGSVhN
RTogVGhlIHNwYWNpbmcgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB3aG9sZSBlbWJlbGxpc2hlZCBv
cGVyYXRvciAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDgzMSku
CiAgICAgLy8gRklYTUU6IFRoZSBzcGFjaW5nIHNob3VsZCBvbmx5IGJlIGFkZGVkIGluc2lkZSAo
cGVyaGFwcyBpbmZlcnJlZCkgbXJvdyAoaHR0cDovL3d3dy53My5vcmcvVFIvTWF0aE1ML2NoYXB0
ZXIzLmh0bWwjcHJlc20ub3BzcGFjaW5nKS4KQEAgLTY0NywyNyArNjI3LDI0IEBAIHZvaWQgUmVu
ZGVyTWF0aE1MT3BlcmF0b3I6OnVwZGF0ZVN0eWxlKCkKICAgICAgICAgcmV0dXJuOwogCiAgICAg
aWYgKG1faXNWZXJ0aWNhbCAmJiBpc0xhcmdlT3BlcmF0b3JJbkRpc3BsYXlTdHlsZSgpKQotICAg
ICAgICBtX3N0cmV0Y2h5RGF0YSA9IGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKKyAg
ICAgICAgY2FsY3VsYXRlRGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpOwogICAgIGVsc2Ugewot
ICAgICAgICAvLyBXZSBkbyBub3Qgc3RyZXRjaCBpZiB0aGUgYmFzZSBnbHlwaCBpcyBsYXJnZSBl
bm91Z2guCi0gICAgICAgIEdseXBoRGF0YSBiYXNlR2x5cGggPSBzdHlsZSgpLmZvbnRDYXNjYWRl
KCkuZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1fdGV4dENvbnRlbnQsICFzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSk7Ci0gICAgICAgIGZsb2F0IGJhc2VTaXplID0gbV9pc1ZlcnRpY2Fs
ID8gaGVpZ2h0Rm9yR2x5cGgoYmFzZUdseXBoKSA6IGFkdmFuY2VXaWR0aEZvckdseXBoKGJhc2VH
bHlwaCk7Ci0gICAgICAgIGlmIChzdHJldGNoU2l6ZSgpIDw9IGJhc2VTaXplKQorICAgICAgICBj
YWxjdWxhdGVTdHJldGNoeURhdGEobnVsbHB0ciwgc3RyZXRjaFNpemUoKSk7CisgICAgICAgIGlm
IChtX3N0cmV0Y2hUeXBlID09IFVuc3RyZXRjaGVkKQogICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICBtX3N0cmV0Y2h5RGF0YSA9IGZpbmRTdHJldGNoeURhdGEobnVsbHB0cik7CiAgICAgfQog
Ci0gICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd1Np
emVWYXJpYW50KSB7CisgICAgaWYgKG1faXNWZXJ0aWNhbCAmJiBtX3N0cmV0Y2hUeXBlID09IFNp
emVWYXJpYW50KSB7CiAgICAgICAgIC8vIFdlIHJlc2l6ZSB0aGUgb3BlcmF0b3IgdG8gbWF0Y2gg
dGhlIG9uZSBvZiB0aGUgc2l6ZSB2YXJpYW50LgogICAgICAgICBpZiAoaXNMYXJnZU9wZXJhdG9y
SW5EaXNwbGF5U3R5bGUoKSkgewotICAgICAgICAgICAgLy8gVGhlIHN0cmV0Y2ggc2l6ZSBpcyBh
Y3R1YWxseSBub3QgaW52b2x2ZWQgaW4gdGhlIHNlbGVjdGlvbiBvZiB0aGUgc2l6ZSB2YXJpYW50
IGluIGdldERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCisgICAgICAgICAgICAvLyBUaGUgc3Ry
ZXRjaCBzaXplIGlzIGFjdHVhbGx5IG5vdCBpbnZvbHZlZCBpbiB0aGUgc2VsZWN0aW9uIG9mIHRo
ZSBzaXplIHZhcmlhbnQgaW4gZmluZERpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IuCiAgICAgICAg
ICAgICAvLyBXZSBzaW1wbHkgdXNlIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBzZWxlY3Rl
ZCBzaXplIHZhcmlhbnQgZ2x5cGguCi0gICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMg
PSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS52YXJpYW50KCkpOworICAgICAgICAgICAg
RmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV92YXJpYW50KTsKICAgICAg
ICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSAtZ2x5cGhCb3VuZHMueSgpOwog
ICAgICAgICAgICAgbV9zdHJldGNoRGVwdGhCZWxvd0Jhc2VsaW5lID0gZ2x5cGhCb3VuZHMubWF4
WSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2UgcmVzY2FsZSB0aGUgaGVp
Z2h0IGFuZCBkZXB0aCBwcm9wb3J0aW9uYXRlbHkuCi0gICAgICAgICAgICBmbG9hdCB2YXJpYW50
U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAg
ICAgICBmbG9hdCB2YXJpYW50U2l6ZSA9IGhlaWdodEZvckdseXBoKG1fdmFyaWFudCk7CiAgICAg
ICAgICAgICBmbG9hdCBzaXplID0gc3RyZXRjaFNpemUoKTsKICAgICAgICAgICAgIGZsb2F0IGFz
cGVjdCA9IHNpemUgPiAwID8gdmFyaWFudFNpemUgLyBzaXplIDogMS4wOwogICAgICAgICAgICAg
bV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSAqPSBhc3BlY3Q7CkBAIC02NzYsMzAgKzY1Mywz
MCBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAgICAgfQogCiAg
ICAgaWYgKCFtX2lzVmVydGljYWwpIHsKLSAgICAgICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUo
KSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsKLSAgICAgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5k
cyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgIGlm
IChtX3N0cmV0Y2hUeXBlID09IFNpemVWYXJpYW50KSB7CisgICAgICAgICAgICBGbG9hdFJlY3Qg
Z2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3ZhcmlhbnQpOwogICAgICAgICAgICAgbV9z
dHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSA9IC1nbHlwaEJvdW5kcy55KCk7CiAgICAgICAgICAg
ICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBnbHlwaEJvdW5kcy5tYXhZKCk7Ci0gICAg
ICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlE
YXRhLnZhcmlhbnQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9zdHJldGNoeURhdGEubW9kZSgp
ID09IERyYXdHbHlwaEFzc2VtYmx5KSB7CisgICAgICAgICAgICBtX3N0cmV0Y2hXaWR0aCA9IGFk
dmFuY2VXaWR0aEZvckdseXBoKG1fdmFyaWFudCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9zdHJl
dGNoVHlwZSA9PSBHbHlwaEFzc2VtYmx5KSB7CiAgICAgICAgICAgICBGbG9hdFJlY3QgZ2x5cGhC
b3VuZHM7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gMDsKICAg
ICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IDA7CiAKLSAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubGVmdCgpKTsKKyAg
ICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5sZWZ0KTsK
ICAgICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlv
dXRVbml0PihtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsK
ICAgICAgICAgICAgIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSA9IHN0ZDo6bWF4PExheW91
dFVuaXQ+KG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZSwgZ2x5cGhCb3VuZHMubWF4WSgpKTsK
IAotICAgICAgICAgICAgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0Y2h5RGF0
YS5yaWdodCgpKTsKKyAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9h
c3NlbWJseS5yaWdodCk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5l
ID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNoSGVpZ2h0QWJvdmVCYXNlbGluZSwgLWds
eXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUg
PSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBo
Qm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5
cGgobV9zdHJldGNoeURhdGEuZXh0ZW5zaW9uKCkpOworICAgICAgICAgICAgZ2x5cGhCb3VuZHMg
PSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5LmV4dGVuc2lvbik7CiAgICAgICAgICAgICBtX3N0
cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lID0gc3RkOjptYXg8TGF5b3V0VW5pdD4obV9zdHJldGNo
SGVpZ2h0QWJvdmVCYXNlbGluZSwgLWdseXBoQm91bmRzLnkoKSk7CiAgICAgICAgICAgICBtX3N0
cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRVbml0PihtX3N0cmV0Y2hE
ZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7CiAKLSAgICAgICAgICAgIGlm
IChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgewotICAgICAgICAgICAgICAgIGdseXBo
Qm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEubWlkZGxlKCkpOworICAgICAg
ICAgICAgaWYgKG1fYXNzZW1ibHkubWlkZGxlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAg
IGdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5taWRkbGUpOwogICAgICAg
ICAgICAgICAgIG1fc3RyZXRjaEhlaWdodEFib3ZlQmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlvdXRV
bml0PihtX3N0cmV0Y2hIZWlnaHRBYm92ZUJhc2VsaW5lLCAtZ2x5cGhCb3VuZHMueSgpKTsKICAg
ICAgICAgICAgICAgICBtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUgPSBzdGQ6Om1heDxMYXlv
dXRVbml0PihtX3N0cmV0Y2hEZXB0aEJlbG93QmFzZWxpbmUsIGdseXBoQm91bmRzLm1heFkoKSk7
CiAgICAgICAgICAgICB9CkBAIC03MDksMTQgKzY4NiwxNCBAQCB2b2lkIFJlbmRlck1hdGhNTE9w
ZXJhdG9yOjp1cGRhdGVTdHlsZSgpCiAKIE9wdGlvbmFsPGludD4gUmVuZGVyTWF0aE1MT3BlcmF0
b3I6OmZpcnN0TGluZUJhc2VsaW5lKCkgY29uc3QKIHsKLSAgICBpZiAobV9zdHJldGNoeURhdGEu
bW9kZSgpICE9IERyYXdOb3JtYWwpCisgICAgaWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNo
ZWQpCiAgICAgICAgIHJldHVybiBPcHRpb25hbDxpbnQ+KG1fc3RyZXRjaEhlaWdodEFib3ZlQmFz
ZWxpbmUpOwogICAgIHJldHVybiBSZW5kZXJNYXRoTUxUb2tlbjo6Zmlyc3RMaW5lQmFzZWxpbmUo
KTsKIH0KIAogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6Y29tcHV0ZUxvZ2ljYWxIZWlnaHQo
TGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExvZ2ljYWxF
eHRlbnRDb21wdXRlZFZhbHVlcyYgY29tcHV0ZWRWYWx1ZXMpIGNvbnN0CiB7Ci0gICAgaWYgKG1f
c3RyZXRjaHlEYXRhLm1vZGUoKSAhPSBEcmF3Tm9ybWFsKQorICAgIGlmIChtX3N0cmV0Y2hUeXBl
ICE9IFVuc3RyZXRjaGVkKQogICAgICAgICBsb2dpY2FsSGVpZ2h0ID0gbV9zdHJldGNoSGVpZ2h0
QWJvdmVCYXNlbGluZSArIG1fc3RyZXRjaERlcHRoQmVsb3dCYXNlbGluZTsKICAgICBSZW5kZXJC
b3g6OmNvbXB1dGVMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQsIGxvZ2ljYWxUb3AsIGNvbXB1
dGVkVmFsdWVzKTsKIH0KQEAgLTc3Niw4ICs3NTMsOCBAQCBMYXlvdXRSZWN0IFJlbmRlck1hdGhN
TE9wZXJhdG9yOjpwYWludEdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QgR2x5cGhEYXRhJiBk
YQogdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkds
eXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91
dFBvaW50JiB0bykKIHsKICAgICBBU1NFUlQobV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9z
dHJldGNoeURhdGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9z
dHJldGNoeURhdGEuZXh0ZW5zaW9uKCkuZ2x5cGgpOworICAgIEFTU0VSVChtX3N0cmV0Y2hUeXBl
ID09IEdseXBoQXNzZW1ibHkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5LmV4dGVuc2lvbi5pc1Zh
bGlkKCkpOwogICAgIEFTU0VSVChmcm9tLnkoKSA8PSB0by55KCkpOwogCiAgICAgLy8gSWYgdGhl
cmUgaXMgbm8gc3BhY2UgZm9yIHRoZSBleHRlbnNpb24gZ2x5cGgsIHdlIGRvbid0IG5lZWQgdG8g
ZG8gYW55dGhpbmcuCkBAIC03ODYsNyArNzYzLDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRv
cjo6ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QK
IAogICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihpbmZvLmNvbnRleHQo
KSk7CiAKLSAgICBGbG9hdFJlY3QgZ2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX3N0cmV0
Y2h5RGF0YS5leHRlbnNpb24oKSk7CisgICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gYm91bmRz
Rm9yR2x5cGgobV9hc3NlbWJseS5leHRlbnNpb24pOwogCiAgICAgLy8gQ2xpcHBpbmcgdGhlIGV4
dGVuZGVyIHJlZ2lvbiBoZXJlIGFsbG93cyB1cyB0byBkcmF3IHRoZSBib3R0b20gZXh0ZW5kZXIg
Z2x5cGggaW50byB0aGUKICAgICAvLyByZWdpb25zIG9mIHRoZSBib3R0b20gZ2x5cGggd2l0aG91
dCB3b3JyeWluZyBhYm91dCBvdmVyZHJhdyAoaGFpcnkgcGl4ZWxzKSBhbmQgc2ltcGxpZmllcyBs
YXRlciBjbGlwcGluZy4KQEAgLTgwMSw3ICs3NzgsNyBAQCB2b2lkIFJlbmRlck1hdGhNTE9wZXJh
dG9yOjpmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoUGFpbnRJbmZvJiBpbmZvLCBjb25z
dAogICAgIEZsb2F0UmVjdCBsYXN0UGFpbnRlZEdseXBoUmVjdChmcm9tLCBGbG9hdFNpemUoKSk7
CiAKICAgICB3aGlsZSAobGFzdFBhaW50ZWRHbHlwaFJlY3QubWF4WSgpIDwgdG8ueSgpKSB7Ci0g
ICAgICAgIGxhc3RQYWludGVkR2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5
RGF0YS5leHRlbnNpb24oKSwgZ2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAg
ICBsYXN0UGFpbnRlZEdseXBoUmVjdCA9IHBhaW50R2x5cGgoaW5mbywgbV9hc3NlbWJseS5leHRl
bnNpb24sIGdseXBoT3JpZ2luLCBUcmltVG9wQW5kQm90dG9tKTsKICAgICAgICAgZ2x5cGhPcmln
aW4uc2V0WShnbHlwaE9yaWdpbi55KCkgKyBsYXN0UGFpbnRlZEdseXBoUmVjdC5oZWlnaHQoKSk7
CiAKICAgICAgICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0IGlmIHRoZSBmb250IHNpemUgaXMg
c21hbGwgZW5vdWdoIHRoZSBnbHVlIGdseXBoIGhhcyBiZWVuIHJlZHVjZWQgdG8gYW4gZW1wdHkg
cmVjdGFuZ2xlCkBAIC04MTQsOCArNzkxLDggQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6
ZmlsbFdpdGhWZXJ0aWNhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uc3QKIHZv
aWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBo
KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIGZyb20sIGNvbnN0IExheW91dFBv
aW50JiB0bykKIHsKICAgICBBU1NFUlQoIW1faXNWZXJ0aWNhbCk7Ci0gICAgQVNTRVJUKG1fc3Ry
ZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3R2x5cGhBc3NlbWJseSk7Ci0gICAgQVNTRVJUKG1fc3Ry
ZXRjaHlEYXRhLmV4dGVuc2lvbigpLmdseXBoKTsKKyAgICBBU1NFUlQobV9zdHJldGNoVHlwZSA9
PSBHbHlwaEFzc2VtYmx5KTsKKyAgICBBU1NFUlQobV9hc3NlbWJseS5leHRlbnNpb24uaXNWYWxp
ZCgpKTsKICAgICBBU1NFUlQoZnJvbS54KCkgPD0gdG8ueCgpKTsKIAogICAgIC8vIElmIHRoZXJl
IGlzIG5vIHNwYWNlIGZvciB0aGUgZXh0ZW5zaW9uIGdseXBoLCB3ZSBkb24ndCBuZWVkIHRvIGRv
IGFueXRoaW5nLgpAQCAtODM3LDcgKzgxNCw3IEBAIHZvaWQgUmVuZGVyTWF0aE1MT3BlcmF0b3I6
OmZpbGxXaXRoSG9yaXpvbnRhbEV4dGVuc2lvbkdseXBoKFBhaW50SW5mbyYgaW5mbywgY29uCiAg
ICAgRmxvYXRSZWN0IGxhc3RQYWludGVkR2x5cGhSZWN0KGZyb20sIEZsb2F0U2l6ZSgpKTsKIAog
ICAgIHdoaWxlIChsYXN0UGFpbnRlZEdseXBoUmVjdC5tYXhYKCkgPCB0by54KCkpIHsKLSAgICAg
ICAgbGFzdFBhaW50ZWRHbHlwaFJlY3QgPSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRh
LmV4dGVuc2lvbigpLCBnbHlwaE9yaWdpbiwgVHJpbUxlZnRBbmRSaWdodCk7CisgICAgICAgIGxh
c3RQYWludGVkR2x5cGhSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5LmV4dGVuc2lv
biwgZ2x5cGhPcmlnaW4sIFRyaW1MZWZ0QW5kUmlnaHQpOwogICAgICAgICBnbHlwaE9yaWdpbi5z
ZXRYKGdseXBoT3JpZ2luLngoKSArIGxhc3RQYWludGVkR2x5cGhSZWN0LndpZHRoKCkpOwogCiAg
ICAgICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBpZiB0aGUgZm9udCBzaXplIGlzIHNtYWxs
IGVub3VnaCB0aGUgZ2x1ZSBnbHlwaCBoYXMgYmVlbiByZWR1Y2VkIHRvIGFuIGVtcHR5IHJlY3Rh
bmdsZQpAQCAtODUxLDIwICs4MjgsMjAgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFp
bnQoUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQKIHsKICAg
ICBSZW5kZXJNYXRoTUxUb2tlbjo6cGFpbnQoaW5mbywgcGFpbnRPZmZzZXQpOwogCi0gICAgaWYg
KGluZm8uY29udGV4dCgpLnBhaW50aW5nRGlzYWJsZWQoKSB8fCBpbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VGb3JlZ3JvdW5kIHx8IHN0eWxlKCkudmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbV9z
dHJldGNoeURhdGEubW9kZSgpID09IERyYXdOb3JtYWwpCisgICAgaWYgKGluZm8uY29udGV4dCgp
LnBhaW50aW5nRGlzYWJsZWQoKSB8fCBpbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5k
IHx8IHN0eWxlKCkudmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbV9zdHJldGNoVHlwZSA9PSBV
bnN0cmV0Y2hlZCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKGluZm8uY29udGV4dCgpKTsKICAgICBpbmZvLmNvbnRleHQoKS5zZXRG
aWxsQ29sb3Ioc3R5bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvcikp
OwogCi0gICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1vZGUoKSA9PSBEcmF3U2l6ZVZhcmlhbnQpIHsK
LSAgICAgICAgQVNTRVJUKG1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5nbHlwaCk7CisgICAgaWYg
KG1fc3RyZXRjaFR5cGUgPT0gU2l6ZVZhcmlhbnQpIHsKKyAgICAgICAgQVNTRVJUKG1fdmFyaWFu
dC5pc1ZhbGlkKCkpOwogICAgICAgICBHbHlwaEJ1ZmZlciBidWZmZXI7Ci0gICAgICAgIGJ1ZmZl
ci5hZGQobV9zdHJldGNoeURhdGEudmFyaWFudCgpLmdseXBoLCBtX3N0cmV0Y2h5RGF0YS52YXJp
YW50KCkuZm9udCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgp
KSk7CisgICAgICAgIGJ1ZmZlci5hZGQobV92YXJpYW50LmdseXBoLCBtX3ZhcmlhbnQuZm9udCwg
YWR2YW5jZVdpZHRoRm9yR2x5cGgobV92YXJpYW50KSk7CiAgICAgICAgIExheW91dFBvaW50IG9w
ZXJhdG9yVG9wTGVmdCA9IGNlaWxlZEludFBvaW50KHBhaW50T2Zmc2V0ICsgbG9jYXRpb24oKSk7
Ci0gICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fc3RyZXRj
aHlEYXRhLnZhcmlhbnQoKSk7CisgICAgICAgIEZsb2F0UmVjdCBnbHlwaEJvdW5kcyA9IGJvdW5k
c0ZvckdseXBoKG1fdmFyaWFudCk7CiAgICAgICAgIExheW91dFBvaW50IG9wZXJhdG9yT3JpZ2lu
KG9wZXJhdG9yVG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkgLSBnbHlwaEJvdW5kcy55
KCkpOwotICAgICAgICBpbmZvLmNvbnRleHQoKS5kcmF3R2x5cGhzKHN0eWxlKCkuZm9udENhc2Nh
ZGUoKSwgKm1fc3RyZXRjaHlEYXRhLnZhcmlhbnQoKS5mb250LCBidWZmZXIsIDAsIDEsIG9wZXJh
dG9yT3JpZ2luKTsKKyAgICAgICAgaW5mby5jb250ZXh0KCkuZHJhd0dseXBocyhzdHlsZSgpLmZv
bnRDYXNjYWRlKCksICptX3ZhcmlhbnQuZm9udCwgYnVmZmVyLCAwLCAxLCBvcGVyYXRvck9yaWdp
bik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTg3NywzMCArODU0LDMwIEBAIHZvaWQg
UmVuZGVyTWF0aE1MT3BlcmF0b3I6OnBhaW50KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0
UG9pbnQmIHBhaW50T2Zmc2V0CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludFZlcnRp
Y2FsR2x5cGhBc3NlbWJseShQYWludEluZm8mIGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWlu
dE9mZnNldCkKIHsKICAgICBBU1NFUlQobV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJl
dGNoeURhdGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJl
dGNoeURhdGEudG9wKCkuZ2x5cGgpOwotICAgIEFTU0VSVChtX3N0cmV0Y2h5RGF0YS5ib3R0b20o
KS5nbHlwaCk7CisgICAgQVNTRVJUKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7Cisg
ICAgQVNTRVJUKG1fYXNzZW1ibHkudG9wLmlzVmFsaWQoKSk7CisgICAgQVNTRVJUKG1fYXNzZW1i
bHkuYm90dG9tLmlzVmFsaWQoKSk7CiAKICAgICAvLyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGds
eXBocyBzbyB0aGF0IHRoZSBlZGdlIG9mIHRoZSB0aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBl
eGFjdGx5IHdpdGggdGhlIGVkZ2VzIG9mIG91ciBwYWludCBib3guCiAgICAgTGF5b3V0UG9pbnQg
b3BlcmF0b3JUb3BMZWZ0ID0gcGFpbnRPZmZzZXQgKyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9y
VG9wTGVmdC5tb3ZlKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gbV9sZWFkaW5n
U3BhY2UgOiBtX3RyYWlsaW5nU3BhY2UsIDApOwogICAgIG9wZXJhdG9yVG9wTGVmdCA9IGNlaWxl
ZEludFBvaW50KG9wZXJhdG9yVG9wTGVmdCk7Ci0gICAgRmxvYXRSZWN0IHRvcEdseXBoQm91bmRz
ID0gYm91bmRzRm9yR2x5cGgobV9zdHJldGNoeURhdGEudG9wKCkpOworICAgIEZsb2F0UmVjdCB0
b3BHbHlwaEJvdW5kcyA9IGJvdW5kc0ZvckdseXBoKG1fYXNzZW1ibHkudG9wKTsKICAgICBMYXlv
dXRQb2ludCB0b3BHbHlwaE9yaWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExl
ZnQueSgpIC0gdG9wR2x5cGhCb3VuZHMueSgpKTsKLSAgICBMYXlvdXRSZWN0IHRvcEdseXBoUGFp
bnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS50b3AoKSwgdG9wR2x5cGhP
cmlnaW4sIFRyaW1Cb3R0b20pOworICAgIExheW91dFJlY3QgdG9wR2x5cGhQYWludFJlY3QgPSBw
YWludEdseXBoKGluZm8sIG1fYXNzZW1ibHkudG9wLCB0b3BHbHlwaE9yaWdpbiwgVHJpbUJvdHRv
bSk7CiAKLSAgICBGbG9hdFJlY3QgYm90dG9tR2x5cGhCb3VuZHMgPSBib3VuZHNGb3JHbHlwaCht
X3N0cmV0Y2h5RGF0YS5ib3R0b20oKSk7CisgICAgRmxvYXRSZWN0IGJvdHRvbUdseXBoQm91bmRz
ID0gYm91bmRzRm9yR2x5cGgobV9hc3NlbWJseS5ib3R0b20pOwogICAgIExheW91dFBvaW50IGJv
dHRvbUdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIG9wZXJhdG9yVG9wTGVmdC55KCkg
KyBvZmZzZXRIZWlnaHQoKSAtIChib3R0b21HbHlwaEJvdW5kcy5oZWlnaHQoKSArIGJvdHRvbUds
eXBoQm91bmRzLnkoKSkpOwotICAgIExheW91dFJlY3QgYm90dG9tR2x5cGhQYWludFJlY3QgPSBw
YWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmJvdHRvbSgpLCBib3R0b21HbHlwaE9yaWdp
biwgVHJpbVRvcCk7CisgICAgTGF5b3V0UmVjdCBib3R0b21HbHlwaFBhaW50UmVjdCA9IHBhaW50
R2x5cGgoaW5mbywgbV9hc3NlbWJseS5ib3R0b20sIGJvdHRvbUdseXBoT3JpZ2luLCBUcmltVG9w
KTsKIAotICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKS5nbHlwaCkgeworICAgIGlmICht
X2Fzc2VtYmx5Lm1pZGRsZS5pc1ZhbGlkKCkpIHsKICAgICAgICAgLy8gQ2VudGVyIHRoZSBnbHlw
aCBvcmlnaW4gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBnbHlwaCBwYWludCBleHRlbnRzLiBU
aGVuIHNoaWZ0IGl0IGhhbGYgdGhlIHBhaW50IGhlaWdodCB0b3dhcmQgdGhlIGJvdHRvbSBnbHlw
aC4KLSAgICAgICAgRmxvYXRSZWN0IG1pZGRsZUdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgo
bV9zdHJldGNoeURhdGEubWlkZGxlKCkpOworICAgICAgICBGbG9hdFJlY3QgbWlkZGxlR2x5cGhC
b3VuZHMgPSBib3VuZHNGb3JHbHlwaChtX2Fzc2VtYmx5Lm1pZGRsZSk7CiAgICAgICAgIExheW91
dFBvaW50IG1pZGRsZUdseXBoT3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCksIHRvcEdseXBoT3Jp
Z2luLnkoKSk7CiAgICAgICAgIG1pZGRsZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2ludCgw
LCAoYm90dG9tR2x5cGhQYWludFJlY3QueSgpIC0gdG9wR2x5cGhQYWludFJlY3QubWF4WSgpKSAv
IDIuMCkpOwogICAgICAgICBtaWRkbGVHbHlwaE9yaWdpbi5tb3ZlQnkoTGF5b3V0UG9pbnQoMCwg
bWlkZGxlR2x5cGhCb3VuZHMuaGVpZ2h0KCkgLyAyLjApKTsKIAotICAgICAgICBMYXlvdXRSZWN0
IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5t
aWRkbGUoKSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOworICAgICAgICBM
YXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2Vt
Ymx5Lm1pZGRsZSwgbWlkZGxlR2x5cGhPcmlnaW4sIFRyaW1Ub3BBbmRCb3R0b20pOwogICAgICAg
ICBmaWxsV2l0aFZlcnRpY2FsRXh0ZW5zaW9uR2x5cGgoaW5mbywgdG9wR2x5cGhQYWludFJlY3Qu
bWluWE1heFlDb3JuZXIoKSwgbWlkZGxlR2x5cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7
CiAgICAgICAgIGZpbGxXaXRoVmVydGljYWxFeHRlbnNpb25HbHlwaChpbmZvLCBtaWRkbGVHbHlw
aFBhaW50UmVjdC5taW5YTWF4WUNvcm5lcigpLCBib3R0b21HbHlwaFBhaW50UmVjdC5taW5YTWlu
WUNvcm5lcigpKTsKICAgICB9IGVsc2UKQEAgLTkxMCwyNiArODg3LDI2IEBAIHZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OnBhaW50VmVydGljYWxHbHlwaEFzc2VtYmx5KFBhaW50SW5mbyYgaW5m
bywgY29uc3QgTGF5CiB2b2lkIFJlbmRlck1hdGhNTE9wZXJhdG9yOjpwYWludEhvcml6b250YWxH
bHlwaEFzc2VtYmx5KFBhaW50SW5mbyYgaW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zm
c2V0KQogewogICAgIEFTU0VSVCghbV9pc1ZlcnRpY2FsKTsKLSAgICBBU1NFUlQobV9zdHJldGNo
eURhdGEubW9kZSgpID09IERyYXdHbHlwaEFzc2VtYmx5KTsKLSAgICBBU1NFUlQobV9zdHJldGNo
eURhdGEubGVmdCgpLmdseXBoKTsKLSAgICBBU1NFUlQobV9zdHJldGNoeURhdGEucmlnaHQoKS5n
bHlwaCk7CisgICAgQVNTRVJUKG1fc3RyZXRjaFR5cGUgPT0gR2x5cGhBc3NlbWJseSk7CisgICAg
QVNTRVJUKG1fYXNzZW1ibHkubGVmdC5pc1ZhbGlkKCkpOworICAgIEFTU0VSVChtX2Fzc2VtYmx5
LnJpZ2h0LmlzVmFsaWQoKSk7CiAKICAgICAvLyBXZSBhcmUgcG9zaXRpb25pbmcgdGhlIGdseXBo
cyBzbyB0aGF0IHRoZSBlZGdlIG9mIHRoZSB0aWdodCBnbHlwaCBib3VuZHMgbGluZSB1cCBleGFj
dGx5IHdpdGggdGhlIGVkZ2VzIG9mIG91ciBwYWludCBib3guCiAgICAgTGF5b3V0UG9pbnQgb3Bl
cmF0b3JUb3BMZWZ0ID0gcGFpbnRPZmZzZXQgKyBsb2NhdGlvbigpOwogICAgIG9wZXJhdG9yVG9w
TGVmdC5tb3ZlKG1fbGVhZGluZ1NwYWNlLCAwKTsKICAgICBvcGVyYXRvclRvcExlZnQgPSBjZWls
ZWRJbnRQb2ludChvcGVyYXRvclRvcExlZnQpOwogICAgIExheW91dFBvaW50IGxlZnRHbHlwaE9y
aWdpbihvcGVyYXRvclRvcExlZnQueCgpLCBvcGVyYXRvclRvcExlZnQueSgpICsgbV9zdHJldGNo
SGVpZ2h0QWJvdmVCYXNlbGluZSk7Ci0gICAgTGF5b3V0UmVjdCBsZWZ0R2x5cGhQYWludFJlY3Qg
PSBwYWludEdseXBoKGluZm8sIG1fc3RyZXRjaHlEYXRhLmxlZnQoKSwgbGVmdEdseXBoT3JpZ2lu
LCBUcmltUmlnaHQpOworICAgIExheW91dFJlY3QgbGVmdEdseXBoUGFpbnRSZWN0ID0gcGFpbnRH
bHlwaChpbmZvLCBtX2Fzc2VtYmx5LmxlZnQsIGxlZnRHbHlwaE9yaWdpbiwgVHJpbVJpZ2h0KTsK
IAotICAgIEZsb2F0UmVjdCByaWdodEdseXBoQm91bmRzID0gYm91bmRzRm9yR2x5cGgobV9zdHJl
dGNoeURhdGEucmlnaHQoKSk7CisgICAgRmxvYXRSZWN0IHJpZ2h0R2x5cGhCb3VuZHMgPSBib3Vu
ZHNGb3JHbHlwaChtX2Fzc2VtYmx5LnJpZ2h0KTsKICAgICBMYXlvdXRQb2ludCByaWdodEdseXBo
T3JpZ2luKG9wZXJhdG9yVG9wTGVmdC54KCkgKyBvZmZzZXRXaWR0aCgpIC0gcmlnaHRHbHlwaEJv
dW5kcy53aWR0aCgpLCBvcGVyYXRvclRvcExlZnQueSgpICsgbV9zdHJldGNoSGVpZ2h0QWJvdmVC
YXNlbGluZSk7Ci0gICAgTGF5b3V0UmVjdCByaWdodEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlw
aChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5yaWdodCgpLCByaWdodEdseXBoT3JpZ2luLCBUcmltTGVm
dCk7CisgICAgTGF5b3V0UmVjdCByaWdodEdseXBoUGFpbnRSZWN0ID0gcGFpbnRHbHlwaChpbmZv
LCBtX2Fzc2VtYmx5LnJpZ2h0LCByaWdodEdseXBoT3JpZ2luLCBUcmltTGVmdCk7CiAKLSAgICBp
ZiAobV9zdHJldGNoeURhdGEubWlkZGxlKCkuZ2x5cGgpIHsKKyAgICBpZiAobV9hc3NlbWJseS5t
aWRkbGUuaXNWYWxpZCgpKSB7CiAgICAgICAgIC8vIENlbnRlciB0aGUgZ2x5cGggb3JpZ2luIGJl
dHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgZ2x5cGggcGFpbnQgZXh0ZW50cy4KICAgICAgICAgTGF5
b3V0UG9pbnQgbWlkZGxlR2x5cGhPcmlnaW4ob3BlcmF0b3JUb3BMZWZ0LngoKSwgbGVmdEdseXBo
T3JpZ2luLnkoKSk7CiAgICAgICAgIG1pZGRsZUdseXBoT3JpZ2luLm1vdmVCeShMYXlvdXRQb2lu
dCgocmlnaHRHbHlwaFBhaW50UmVjdC54KCkgLSBsZWZ0R2x5cGhQYWludFJlY3QubWF4WCgpKSAv
IDIuMCwgMCkpOwotICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRSZWN0ID0gcGFp
bnRHbHlwaChpbmZvLCBtX3N0cmV0Y2h5RGF0YS5taWRkbGUoKSwgbWlkZGxlR2x5cGhPcmlnaW4s
IFRyaW1MZWZ0QW5kUmlnaHQpOworICAgICAgICBMYXlvdXRSZWN0IG1pZGRsZUdseXBoUGFpbnRS
ZWN0ID0gcGFpbnRHbHlwaChpbmZvLCBtX2Fzc2VtYmx5Lm1pZGRsZSwgbWlkZGxlR2x5cGhPcmln
aW4sIFRyaW1MZWZ0QW5kUmlnaHQpOwogICAgICAgICBmaWxsV2l0aEhvcml6b250YWxFeHRlbnNp
b25HbHlwaChpbmZvLCBsZWZ0R2x5cGhQYWludFJlY3QubWF4WE1pbllDb3JuZXIoKSwgbWlkZGxl
R2x5cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgICAgIGZpbGxXaXRoSG9yaXpv
bnRhbEV4dGVuc2lvbkdseXBoKGluZm8sIG1pZGRsZUdseXBoUGFpbnRSZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIHJpZ2h0R2x5cGhQYWludFJlY3QubWluWE1pbllDb3JuZXIoKSk7CiAgICAgfSBlbHNl
CkBAIC05MzksNyArOTE2LDcgQEAgdm9pZCBSZW5kZXJNYXRoTUxPcGVyYXRvcjo6cGFpbnRIb3Jp
em9udGFsR2x5cGhBc3NlbWJseShQYWludEluZm8mIGluZm8sIGNvbnN0IEwKIHZvaWQgUmVuZGVy
TWF0aE1MT3BlcmF0b3I6OnBhaW50Q2hpbGRyZW4oUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0
IExheW91dFBvaW50JiBwYWludE9mZnNldCwgUGFpbnRJbmZvJiBwYWludEluZm9Gb3JDaGlsZCwg
Ym9vbCB1c2VQcmludFJlY3QpCiB7CiAgICAgLy8gV2Ugc2tpcCBwYWludGluZyBmb3IgaW52aXNp
YmxlIG9wZXJhdG9ycyB0b28gdG8gYXZvaWQgc29tZSAibWlzc2luZyBjaGFyYWN0ZXIiIGdseXBo
IHRvIGFwcGVhciBpZiBhcHByb3ByaWF0ZSBtYXRoIGZvbnRzIGFyZSBub3QgYXZhaWxhYmxlLgot
ICAgIGlmIChtX3N0cmV0Y2h5RGF0YS5tb2RlKCkgIT0gRHJhd05vcm1hbCB8fCBpc0ludmlzaWJs
ZU9wZXJhdG9yKCkpCisgICAgaWYgKG1fc3RyZXRjaFR5cGUgIT0gVW5zdHJldGNoZWQgfHwgaXNJ
bnZpc2libGVPcGVyYXRvcigpKQogICAgICAgICByZXR1cm47CiAgICAgUmVuZGVyTWF0aE1MVG9r
ZW46OnBhaW50Q2hpbGRyZW4ocGFpbnRJbmZvLCBwYWludE9mZnNldCwgcGFpbnRJbmZvRm9yQ2hp
bGQsIHVzZVByaW50UmVjdCk7CiB9CkBAIC05NTQsMTkgKzkzMSwxOSBAQCBMYXlvdXRVbml0IFJl
bmRlck1hdGhNTE9wZXJhdG9yOjp0cmFpbGluZ1NwYWNlRXJyb3IoKQogICAgIC8vIEhlbmNlIHdl
IGRldGVybWluZSB0aGUgZXJyb3IgaW4gdGhlIGxvZ2ljYWwgd2lkdGggd2l0aCByZXNwZWN0IHRv
IHRoZSBhY3R1YWwgd2lkdGggb2YgdGhlIGdseXBoKHMpIHVzZWQgdG8gcGFpbnQgdGhlIG9wZXJh
dG9yLgogICAgIExheW91dFVuaXQgd2lkdGggPSBsb2dpY2FsV2lkdGgoKTsKIAotICAgIGlmICht
X3N0cmV0Y2h5RGF0YS5tb2RlKCkgPT0gRHJhd05vcm1hbCkgeworICAgIGlmIChtX3N0cmV0Y2hU
eXBlID09IFVuc3RyZXRjaGVkKSB7CiAgICAgICAgIEdseXBoRGF0YSBkYXRhID0gc3R5bGUoKS5m
b250Q2FzY2FkZSgpLmdseXBoRGF0YUZvckNoYXJhY3Rlcih0ZXh0Q29udGVudCgpLCAhc3R5bGUo
KS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpOwogICAgICAgICByZXR1cm4gd2lkdGggLSBhZHZh
bmNlV2lkdGhGb3JHbHlwaChkYXRhKTsKICAgICB9CiAKLSAgICBpZiAobV9zdHJldGNoeURhdGEu
bW9kZSgpID09IERyYXdTaXplVmFyaWFudCkKLSAgICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5j
ZVdpZHRoRm9yR2x5cGgobV9zdHJldGNoeURhdGEudmFyaWFudCgpKTsKKyAgICBpZiAobV9zdHJl
dGNoVHlwZSA9PSBTaXplVmFyaWFudCkKKyAgICAgICAgcmV0dXJuIHdpZHRoIC0gYWR2YW5jZVdp
ZHRoRm9yR2x5cGgobV92YXJpYW50KTsKIAotICAgIGZsb2F0IGFzc2VtYmx5V2lkdGggPSBhZHZh
bmNlV2lkdGhGb3JHbHlwaChtX3N0cmV0Y2h5RGF0YS50b3AoKSk7Ci0gICAgYXNzZW1ibHlXaWR0
aCA9IHN0ZDo6bWF4KGFzc2VtYmx5V2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRj
aHlEYXRhLmJvdHRvbSgpKSk7Ci0gICAgYXNzZW1ibHlXaWR0aCA9IHN0ZDo6bWF4KGFzc2VtYmx5
V2lkdGgsIGFkdmFuY2VXaWR0aEZvckdseXBoKG1fc3RyZXRjaHlEYXRhLmV4dGVuc2lvbigpKSk7
Ci0gICAgaWYgKG1fc3RyZXRjaHlEYXRhLm1pZGRsZSgpLmdseXBoKQotICAgICAgICBhc3NlbWJs
eVdpZHRoID0gc3RkOjptYXgoYXNzZW1ibHlXaWR0aCwgYWR2YW5jZVdpZHRoRm9yR2x5cGgobV9z
dHJldGNoeURhdGEubWlkZGxlKCkpKTsKKyAgICBmbG9hdCBhc3NlbWJseVdpZHRoID0gYWR2YW5j
ZVdpZHRoRm9yR2x5cGgobV9hc3NlbWJseS50b3ApOworICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6
Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5LmJvdHRv
bSkpOworICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3NlbWJseVdpZHRoLCBhZHZhbmNl
V2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5LmV4dGVuc2lvbikpOworICAgIGlmIChtX2Fzc2VtYmx5
Lm1pZGRsZS5pc1ZhbGlkKCkpCisgICAgICAgIGFzc2VtYmx5V2lkdGggPSBzdGQ6Om1heChhc3Nl
bWJseVdpZHRoLCBhZHZhbmNlV2lkdGhGb3JHbHlwaChtX2Fzc2VtYmx5Lm1pZGRsZSkpOwogICAg
IHJldHVybiB3aWR0aCAtIGFzc2VtYmx5V2lkdGg7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaCBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MT3BlcmF0b3IuaAppbmRleCAzMmMx
MWE0OWI5NzM3ODdhOTE2MDEwYzM0MWU2ZTYxZTYzN2NlM2I1Li5jZDQ1MWI5NzJjNGMyYmU4MzQy
YWEyMzYzYTFkZmRhZTU2ZWNkNjIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbWF0aG1sL1JlbmRlck1hdGhNTE9wZXJhdG9yLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxPcGVyYXRvci5oCkBAIC01MSw3ICs1MSw3IEBAIHB1
YmxpYzoKICAgICAvLyBGSVhNRTogVGhlIGRpc3BsYXlzdHlsZSBwcm9wZXJ0eSBpcyBub3QgaW1w
bGVtZW50ZWQgKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTg3Mzcp
LgogICAgIGJvb2wgaXNMYXJnZU9wZXJhdG9ySW5EaXNwbGF5U3R5bGUoKSBjb25zdCB7IHJldHVy
biAhaGFzT3BlcmF0b3JGbGFnKE1hdGhNTE9wZXJhdG9yRGljdGlvbmFyeTo6U3RyZXRjaHkpICYm
IGhhc09wZXJhdG9yRmxhZyhNYXRoTUxPcGVyYXRvckRpY3Rpb25hcnk6OkxhcmdlT3ApOyB9CiAg
ICAgYm9vbCBpc1ZlcnRpY2FsKCkgY29uc3QgeyByZXR1cm4gbV9pc1ZlcnRpY2FsOyB9Ci0gICAg
TGF5b3V0VW5pdCBpdGFsaWNDb3JyZWN0aW9uKCkgY29uc3Q7CisgICAgTGF5b3V0VW5pdCBpdGFs
aWNDb3JyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9pdGFsaWNDb3JyZWN0aW9uOyB9CiAKICAg
ICB2b2lkIHN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUq
IG9sZFN0eWxlKSBmaW5hbDsKICAgICB2b2lkIHVwZGF0ZVN0eWxlKCkgZmluYWw7CkBAIC03Myw2
MCArNzMsMzEgQEAgcHJvdGVjdGVkOgogICAgIFVDaGFyIHRleHRDb250ZW50KCkgY29uc3QgeyBy
ZXR1cm4gbV90ZXh0Q29udGVudDsgfQogCiBwcml2YXRlOgotICAgIGVudW0gRHJhd01vZGUgewot
ICAgICAgICBEcmF3Tm9ybWFsLCBEcmF3U2l6ZVZhcmlhbnQsIERyYXdHbHlwaEFzc2VtYmx5Cisg
ICAgc3RydWN0IEdseXBoQXNzZW1ibHlEYXRhIHsKKyAgICAgICAgR2x5cGhBc3NlbWJseURhdGEo
KQorICAgICAgICA6IHRvcCgpLCBleHRlbnNpb24oKSwgYm90dG9tKCksIG1pZGRsZSgpIHsgfQor
ICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBHbHlwaERhdGEgdG9wOworICAgICAgICAgICAg
R2x5cGhEYXRhIHJpZ2h0OworICAgICAgICB9OworICAgICAgICBHbHlwaERhdGEgZXh0ZW5zaW9u
OworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBHbHlwaERhdGEgYm90dG9tOworICAgICAg
ICAgICAgR2x5cGhEYXRhIGxlZnQ7CisgICAgICAgIH07CisgICAgICAgIEdseXBoRGF0YSBtaWRk
bGU7CiAgICAgfTsKLQotICAgIGNsYXNzIFN0cmV0Y2h5RGF0YSB7Ci0gICAgcHVibGljOgotICAg
ICAgICBEcmF3TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIEds
eXBoRGF0YSB2YXJpYW50KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzBdOyB9Ci0gICAgICAgIEds
eXBoRGF0YSB0b3AoKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMF07IH0KLSAgICAgICAgR2x5cGhE
YXRhIGV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVsxXTsgfQotICAgICAgICBHbHlw
aERhdGEgYm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzJdOyB9Ci0gICAgICAgIEdseXBo
RGF0YSBtaWRkbGUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFbM107IH0KLSAgICAgICAgR2x5cGhE
YXRhIGxlZnQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFbMl07IH0KLSAgICAgICAgR2x5cGhEYXRh
IHJpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhWzBdOyB9Ci0KLSAgICAgICAgdm9pZCBzZXRO
b3JtYWxNb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9tb2RlID0gRHJhd05vcm1hbDsK
LSAgICAgICAgfQotICAgICAgICB2b2lkIHNldFNpemVWYXJpYW50TW9kZShjb25zdCBHbHlwaERh
dGEmIHZhcmlhbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbW9kZSA9IERyYXdTaXplVmFy
aWFudDsKLSAgICAgICAgICAgIG1fZGF0YVswXSA9IHZhcmlhbnQ7Ci0gICAgICAgIH0KLSAgICAg
ICAgdm9pZCBzZXRHbHlwaEFzc2VtYmx5TW9kZShjb25zdCBHbHlwaERhdGEmIHRvcCwgY29uc3Qg
R2x5cGhEYXRhJiBleHRlbnNpb24sIGNvbnN0IEdseXBoRGF0YSYgYm90dG9tLCBjb25zdCBHbHlw
aERhdGEmIG1pZGRsZSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9tb2RlID0gRHJhd0dseXBo
QXNzZW1ibHk7Ci0gICAgICAgICAgICBtX2RhdGFbMF0gPSB0b3A7Ci0gICAgICAgICAgICBtX2Rh
dGFbMV0gPSBleHRlbnNpb247Ci0gICAgICAgICAgICBtX2RhdGFbMl0gPSBib3R0b207Ci0gICAg
ICAgICAgICBtX2RhdGFbM10gPSBtaWRkbGU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyZXRjaHlE
YXRhKCkKLSAgICAgICAgICAgIDogbV9tb2RlKERyYXdOb3JtYWwpIHsgfQotICAgICAgICBTdHJl
dGNoeURhdGEoY29uc3QgU3RyZXRjaHlEYXRhJiBkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBzd2l0Y2ggKGRhdGEubV9tb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERyYXdOb3JtYWw6Ci0g
ICAgICAgICAgICAgICAgc2V0Tm9ybWFsTW9kZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgY2FzZSBEcmF3U2l6ZVZhcmlhbnQ6Ci0gICAgICAgICAgICAgICAgc2V0U2l6
ZVZhcmlhbnRNb2RlKGRhdGEudmFyaWFudCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNhc2UgRHJhd0dseXBoQXNzZW1ibHk6Ci0gICAgICAgICAgICAgICAgc2V0R2x5
cGhBc3NlbWJseU1vZGUoZGF0YS50b3AoKSwgZGF0YS5leHRlbnNpb24oKSwgZGF0YS5ib3R0b20o
KSwgZGF0YS5taWRkbGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIERyYXdNb2RlIG1fbW9kZTsKLSAg
ICAgICAgLy8gRklYTUU6IEZvciBPcGVuVHlwZSBmb250cyB3aXRoIGEgTUFUSCB0YWJsZSBhbGwg
dGhlIGdseXBocyBhcmUgZnJvbSB0aGUgc2FtZSBmb250LCBzbyB3ZSB3b3VsZCBvbmx5IG5lZWQg
dG8gc3RvcmUgdGhlIGdseXBoIGluZGljZXMgaGVyZS4KLSAgICAgICAgR2x5cGhEYXRhIG1fZGF0
YVs0XTsKKyAgICBlbnVtIFN0cmV0Y2hUeXBlIHsKKyAgICAgICAgVW5zdHJldGNoZWQsCisgICAg
ICAgIFNpemVWYXJpYW50LAorICAgICAgICBHbHlwaEFzc2VtYmx5CisgICAgfTsKKyAgICBTdHJl
dGNoVHlwZSBtX3N0cmV0Y2hUeXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgR2x5cGhEYXRhIG1f
dmFyaWFudDsKKyAgICAgICAgR2x5cGhBc3NlbWJseURhdGEgbV9hc3NlbWJseTsKICAgICB9Owor
ICAgIExheW91dFVuaXQgbV9pdGFsaWNDb3JyZWN0aW9uOwogCiAgICAgY29uc3QgY2hhciogcmVu
ZGVyTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGlzQW5vbnltb3VzKCkgPyAiUmVuZGVy
TWF0aE1MT3BlcmF0b3IgKGFub255bW91cykiIDogIlJlbmRlck1hdGhNTE9wZXJhdG9yIjsgfQog
ICAgIHZvaWQgcGFpbnRDaGlsZHJlbihQYWludEluZm8mIGZvclNlbGYsIGNvbnN0IExheW91dFBv
aW50JiwgUGFpbnRJbmZvJiBmb3JDaGlsZCwgYm9vbCB1c2VQcmludFJlY3QpIGZpbmFsOwpAQCAt
MTQyLDkgKzExMywxMSBAQCBwcml2YXRlOgogICAgIGJvb2wgc2hvdWxkQWxsb3dTdHJldGNoaW5n
KCkgY29uc3Q7CiAKICAgICBib29sIGdldEJhc2VHbHlwaChjb25zdCBSZW5kZXJTdHlsZSYsIEds
eXBoRGF0YSYpIGNvbnN0OwotICAgIGJvb2wgZ2V0R2x5cGhBc3NlbWJseUZhbGxCYWNrKFZlY3Rv
cjxPcGVuVHlwZU1hdGhEYXRhOjpBc3NlbWJseVBhcnQ+LCBTdHJldGNoeURhdGEmKSBjb25zdDsK
LSAgICBTdHJldGNoeURhdGEgZ2V0RGlzcGxheVN0eWxlTGFyZ2VPcGVyYXRvcigpIGNvbnN0Owot
ICAgIFN0cmV0Y2h5RGF0YSBmaW5kU3RyZXRjaHlEYXRhKGZsb2F0KiBtYXhpbXVtR2x5cGhXaWR0
aCk7CisgICAgdm9pZCBzZXRTaXplVmFyaWFudChjb25zdCBHbHlwaERhdGEmKTsKKyAgICB2b2lk
IHNldEdseXBoQXNzZW1ibHkoY29uc3QgR2x5cGhBc3NlbWJseURhdGEmKTsKKyAgICBib29sIGNh
bGN1bGF0ZUdseXBoQXNzZW1ibHlGYWxsQmFjayhWZWN0b3I8T3BlblR5cGVNYXRoRGF0YTo6QXNz
ZW1ibHlQYXJ0PiwgR2x5cGhBc3NlbWJseURhdGEmKSBjb25zdDsKKyAgICB2b2lkIGNhbGN1bGF0
ZURpc3BsYXlTdHlsZUxhcmdlT3BlcmF0b3IoKTsKKyAgICB2b2lkIGNhbGN1bGF0ZVN0cmV0Y2h5
RGF0YShmbG9hdCogbWF4aW11bUdseXBoV2lkdGgsIExheW91dFVuaXQgdGFyZ2V0U2l6ZSA9IDAp
OwogCiAgICAgZW51bSBHbHlwaFBhaW50VHJpbW1pbmcgewogICAgICAgICBUcmltVG9wLApAQCAt
MTc2LDcgKzE0OSw2IEBAIHByaXZhdGU6CiAgICAgTGF5b3V0VW5pdCBtX3RyYWlsaW5nU3BhY2U7
CiAgICAgTGF5b3V0VW5pdCBtX21pblNpemU7CiAgICAgTGF5b3V0VW5pdCBtX21heFNpemU7Ci0g
ICAgU3RyZXRjaHlEYXRhIG1fc3RyZXRjaHlEYXRhOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQo=
</data>
<flag name="review"
          id="302367"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>