<?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>23340</bug_id>
          
          <creation_ts>2009-01-14 20:48:38 -0800</creation_ts>
          <short_desc>Add remaining bits of platform/graphics/chromium</short_desc>
          <delta_ts>2009-01-15 12:52:53 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>105840</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-14 20:48:38 -0800</bug_when>
    <thetext>SimpleFontData, ThemeHelper, UniscribeHelper and friends.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105841</commentid>
    <comment_count>1</comment_count>
      <attachid>26744</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-14 20:50:06 -0800</bug_when>
    <thetext>Created attachment 26744
patch v1

 WebCore/ChangeLog                                  |   76 ++
 .../chromium/SimpleFontDataChromiumWin.cpp         |  171 ++++
 .../graphics/chromium/SimpleFontDataLinux.cpp      |  160 ++++
 .../graphics/chromium/ThemeHelperChromiumWin.cpp   |  104 +++
 .../graphics/chromium/ThemeHelperChromiumWin.h     |   98 +++
 .../platform/graphics/chromium/UniscribeHelper.cpp |  902 ++++++++++++++++++++
 .../platform/graphics/chromium/UniscribeHelper.h   |  399 +++++++++
 .../graphics/chromium/UniscribeHelperTextRun.cpp   |  138 +++
 .../graphics/chromium/UniscribeHelperTextRun.h     |   96 +++
 9 files changed, 2144 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105919</commentid>
    <comment_count>2</comment_count>
      <attachid>26744</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-15 11:09:35 -0800</bug_when>
    <thetext>Comment on attachment 26744
patch v1

Indent (and static_cast)
 static inline float scaleEmToUnits(float x, int unitsPerEm)
 50 {
 51   return unitsPerEm ? x / (float)unitsPerEm : x;
 52 }

No need for the c-style cast:
126     // TEXTMETRICS have this.  Set m_treatAsFixedPitch based off that.
 127     HDC dc = GetDC((HWND)0);
0 works fine w/o cast

This code is copied at least twice:
59     TEXTMETRIC textMetric = {0};
 60     if (!GetTextMetrics(dc, &amp;textMetric)) {
 61         if (ChromiumBridge::ensureFontLoaded(m_font.hfont())) {
 62             // Retry GetTextMetrics.
 63             // FIXME: Handle gracefully the error if this call also fails.
 64             // See http://crbug.com/6401.
 65             if (!GetTextMetrics(dc, &amp;textMetric))
 66                 ASSERT_NOT_REACHED();
 67         }
 68     }
maybe it should be a static function?

Darin fisher learned I was wrong here:
   else
 71         // hack taken from the Windows port
 72         m_xHeight = static_cast&lt;float&gt;(m_ascent) * 0.56;
comments in else/if blocks supposedly cause them to be treated as multi-line by the style guides.  At least that was darin adlers opinion which darin fisher learned earlier this week.

spacing:
 static bool treatAsSpace(UChar c)
 46 {
 47    return c == &apos; &apos; || c == &apos;\t&apos; || c == &apos;\n&apos; || c == 0x00A0;
 48 }
 49 

numItems:
 478         int num_items = 0;
I think the code really means numberOfGlyphs? but I&apos;m not sure.

{ on next line:
5     virtual bool nextWinFontData(HFONT*, SCRIPT_CACHE**, SCRIPT_FONTPROPERTIES**, int* ascent) {
 346         return false;
 347     }

Looks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105920</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-15 11:13:48 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Darin fisher learned I was wrong here:
&gt;    else
&gt;  71         // hack taken from the Windows port
&gt;  72         m_xHeight = static_cast&lt;float&gt;(m_ascent) * 0.56;
&gt; comments in else/if blocks supposedly cause them to be treated as multi-line by
&gt; the style guides.  At least that was darin adlers opinion which darin fisher
&gt; learned earlier this week.

Yes, right, we clarified this a while back. What is considered a one-line control cause is the number of lines of code, including comments, not the number of statements. The guideline is for the human being reading the code, not for the compiler.

If someone&apos;s keeping a list of things we should clarify in the code style guidelines document, I guess that should be one of them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105946</commentid>
    <comment_count>4</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-15 12:52:53 -0800</bug_when>
    <thetext>Comments addressed, committed in http://trac.webkit.org/changeset/39941</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26744</attachid>
            <date>2009-01-14 20:50:06 -0800</date>
            <delta_ts>2009-01-15 11:09:35 -0800</delta_ts>
            <desc>patch v1</desc>
            <filename>patch-v1.patch</filename>
            <type>text/plain</type>
            <size>91086</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">OWJlNzk2NGRkNzRkNDhiZTkwNjBhODY1OWY2MjYyOGRjMTQ3ZWQzNgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA3MzFkMTU4Li4wYWE0YWVi
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSw1ICsxLDgxIEBACiAyMDA5LTAxLTE0ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBj
aHJvbWl1bS5vcmc+CiAKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzMzQwCisgICAg
ICAgIEFkZCByZW1haW5pbmcgYml0cyBvZiBncmFwaGljcy9jaHJvbWl1bS4KKworICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhQ2hyb21pdW1XaW4uY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OnNjYWxlRW1Ub1VuaXRzKToKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQpOgorICAgICAgICAoV2ViQ29yZTo6
U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1w
bGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxl
Rm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVG
b250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2gpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vU2ltcGxlRm9udERhdGFMaW51eC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1w
bGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZv
bnREYXRhOjpzbWFsbENhcHNGb250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250
RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnRE
YXRhOjpkZXRlcm1pbmVQaXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1XaWR0aEZvckdseXBoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpUaGVtZUhlbHBlcldpbjo6VGhlbWVIZWxwZXJXaW4pOgorICAgICAgICAoV2ViQ29yZTo6VGhl
bWVIZWxwZXJXaW46On5UaGVtZUhlbHBlcldpbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlRoZW1lSGVscGVyV2luOjopOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWVIZWxwZXJX
aW46OmNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWVIZWxwZXJXaW46OnJlY3QpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlci5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6dHJlYXRBc1NwYWNlKToKKyAgICAgICAgKFdlYkNv
cmU6OmNvbnRhaW5zTWlzc2luZ0dseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpzZXRMb2dGb250
QW5kU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjpVbmlzY3JpYmVI
ZWxwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjp+VW5pc2NyaWJlSGVs
cGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6aW5pdFdpdGhPcHRpb25h
bExlbmd0aFByb3RlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjp3
aWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6Omp1c3RpZnkpOgorICAg
ICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjpjaGFyYWN0ZXJUb1gpOgorICAgICAgICAo
V2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjp4VG9DaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6VW5pc2NyaWJlSGVscGVyOjpkcmF3KToKKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhl
bHBlcjo6Zmlyc3RHbHlwaEZvckNoYXJhY3Rlcik6CisgICAgICAgIChXZWJDb3JlOjpVbmlzY3Jp
YmVIZWxwZXI6OmZpbGxSdW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6
c2hhcGUpOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjpmaWxsU2hhcGVzKToK
KyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6ZmlsbFNjcmVlbk9yZGVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6YWRqdXN0U3BhY2VBZHZhbmNlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OmFwcGx5U3BhY2luZyk6CisgICAgICAg
IChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OmFkdmFuY2VGb3JJdGVtKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9VbmlzY3JpYmVIZWxwZXIuaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OmRpcmVjdGlvbmFsT3ZlcnJpZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjpzZXREaXJlY3Rpb25hbE92ZXJyaWRlKToK
KyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6aW5oaWJpdExpZ2F0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OnNldEluaGliaXRMaWdhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjpsZXR0ZXJTcGFjaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6c2V0TGV0dGVyU3BhY2luZyk6CisgICAgICAgIChXZWJD
b3JlOjpVbmlzY3JpYmVIZWxwZXI6OnNwYWNlV2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6VW5p
c2NyaWJlSGVscGVyOjpzZXRTcGFjZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmli
ZUhlbHBlcjo6d29yZFNwYWNpbmcpOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVy
OjpzZXRXb3JkU3BhY2luZyk6CisgICAgICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OnNl
dEFzY2VudCk6CisgICAgICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OmluaXQpOgorICAg
ICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVyOjp0cnlUb1ByZWxvYWRGb250KToKKyAgICAg
ICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6U2hhcGluZzo6U2hhcGluZyk6CisgICAgICAg
IChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OlNoYXBpbmc6OmdseXBoTGVuZ3RoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6U2hhcGluZzo6Y2hhckxlbmd0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpVbmlzY3JpYmVIZWxwZXI6OlNoYXBpbmc6OmVmZmVjdGl2ZUFkdmFuY2Vz
KToKKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6bmV4dFdpbkZvbnREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlcjo6cmVzZXRGb250SW5kZXgpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlclRleHRSdW4u
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlVuaXNjcmliZUhlbHBlclRleHRSdW46OlVu
aXNjcmliZUhlbHBlclRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2NyaWJlSGVscGVy
VGV4dFJ1bjo6dHJ5VG9QcmVsb2FkRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpVbmlzY3JpYmVI
ZWxwZXJUZXh0UnVuOjpuZXh0V2luRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6VW5pc2Ny
aWJlSGVscGVyVGV4dFJ1bjo6cmVzZXRGb250SW5kZXgpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlclRleHRSdW4uaDogQWRkZWQuCisKKzIwMDkt
MDEtMTQgIERpbWl0cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KKwogICAgICAg
ICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KIAogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMjUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vU2ltcGxlRm9udERhdGFDaHJvbWl1bVdpbi5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhQ2hyb21pdW1XaW4uY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWZlOTUKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRh
Q2hyb21pdW1XaW4uY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
YykgMjAwOCwgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgIkNocm9t
aXVtQnJpZGdlLmgiCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgor
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2lu
Y2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+Cisj
aW5jbHVkZSA8dW5pY29kZS91bm9ybS5oPgorI2luY2x1ZGUgPG9iamlkbC5oPgorI2luY2x1ZGUg
PG1sYW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGlubGluZSBmbG9hdCBz
Y2FsZUVtVG9Vbml0cyhmbG9hdCB4LCBpbnQgdW5pdHNQZXJFbSkKK3sKKyAgcmV0dXJuIHVuaXRz
UGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OworfQorCit2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQoKQoreworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhHRElP
Qkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOworCisgICAgVEVY
VE1FVFJJQyB0ZXh0TWV0cmljID0gezB9OworICAgIGlmICghR2V0VGV4dE1ldHJpY3MoZGMsICZ0
ZXh0TWV0cmljKSkgeworICAgICAgICBpZiAoQ2hyb21pdW1CcmlkZ2U6OmVuc3VyZUZvbnRMb2Fk
ZWQobV9mb250Lmhmb250KCkpKSB7CisgICAgICAgICAgICAvLyBSZXRyeSBHZXRUZXh0TWV0cmlj
cy4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYW5kbGUgZ3JhY2VmdWxseSB0aGUgZXJyb3IgaWYg
dGhpcyBjYWxsIGFsc28gZmFpbHMuCisgICAgICAgICAgICAvLyBTZWUgaHR0cDovL2NyYnVnLmNv
bS82NDAxLgorICAgICAgICAgICAgaWYgKCFHZXRUZXh0TWV0cmljcyhkYywgJnRleHRNZXRyaWMp
KQorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAg
fQorCisgICAgbV9hdmdDaGFyV2lkdGggPSB0ZXh0TWV0cmljLnRtQXZlQ2hhcldpZHRoOworICAg
IG1fbWF4Q2hhcldpZHRoID0gdGV4dE1ldHJpYy50bU1heENoYXJXaWR0aDsKKworICAgIG1fYXNj
ZW50ID0gdGV4dE1ldHJpYy50bUFzY2VudDsKKyAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmljLnRt
RGVzY2VudDsKKyAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljLnRtRXh0ZXJuYWxMZWFkaW5nOwor
ICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7ICAvLyBCZXN0IGd1ZXNzIGZvciB4SGVp
Z2h0IGZvciBub24tVHJ1ZXR5cGUgZm9udHMuCisKKyAgICBPVVRMSU5FVEVYVE1FVFJJQyBvdXRs
aW5lVGV4dE1ldHJpYzsKKyAgICBpZiAoR2V0T3V0bGluZVRleHRNZXRyaWNzKGRjLCBzaXplb2Yo
b3V0bGluZVRleHRNZXRyaWMpLCAmb3V0bGluZVRleHRNZXRyaWMpID4gMCkgeworICAgICAgICAv
LyBUaGlzIGlzIGEgVHJ1ZVR5cGUgZm9udC4gIFdlIG1pZ2h0IGJlIGFibGUgdG8gZ2V0IGFuIGFj
Y3VyYXRlIHhIZWlnaHQuCisgICAgICAgIEdMWVBITUVUUklDUyBnbHlwaE1ldHJpY3MgPSB7MH07
CisgICAgICAgIE1BVDIgaWRlbnRpdHlNYXRyaXggPSB7ezAsIDF9LCB7MCwgMH0sIHswLCAwfSwg
ezAsIDF9fTsKKyAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lVyhkYywgJ3gnLCBH
R09fTUVUUklDUywgJmdseXBoTWV0cmljcywgMCwgMCwgJmlkZW50aXR5TWF0cml4KTsKKyAgICAg
ICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ2x5cGhNZXRyaWNzLmdtQmxhY2tCb3hZID4gMCkK
KyAgICAgICAgICAgIG1feEhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihnbHlwaE1ldHJpY3Mu
Z21CbGFja0JveFkpOworICAgIH0KKworICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1f
ZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIFNlbGVjdE9iamVjdChkYywgb2xkRm9udCk7Cisg
ICAgUmVsZWFzZURDKDAsIGRjKTsKK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1E
ZXN0cm95KCkKK3sKKyAgICAvLyBXZSBkb24ndCBoYXNoIHRoaXMgb24gV2luMzIsIHNvIGl0J3Mg
ZWZmZWN0aXZlbHkgb3duZWQgYnkgdXMuCisgICAgZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7
CisgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IDA7Cit9CisKK1NpbXBsZUZvbnREYXRhKiBTaW1w
bGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250
RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYgKCFtX3NtYWxsQ2Fwc0ZvbnREYXRhKSB7Cisg
ICAgICAgIExPR0ZPTlQgd2luRm9udDsKKyAgICAgICAgR2V0T2JqZWN0KG1fZm9udC5oZm9udCgp
LCBzaXplb2YoTE9HRk9OVCksICZ3aW5Gb250KTsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzU2l6
ZSA9IDAuNzBmICogZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6ZSgpOworICAgICAgICAvLyBV
bmxpa2UgV2ViS2l0IHRydW5rLCB3ZSBkb24ndCBtdWx0aXBseSB0aGUgc2l6ZSBieSAzMi4gIFRo
YXQgc2VlbXMKKyAgICAgICAgLy8gdG8gYmUgc29tZSBraW5kIG9mIGFydGlmYWN0IG9mIHRoZWly
IENHIGJhY2tlbmQsIG9yIHNvbWV0aGluZy4KKyAgICAgICAgd2luRm9udC5sZkhlaWdodCA9IC1s
cm91bmRmKHNtYWxsQ2Fwc1NpemUpOworICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZvbnRJ
bmRpcmVjdCgmd2luRm9udCk7CisgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPQorICAgICAg
ICAgICAgbmV3IFNpbXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fw
c1NpemUpKTsKKyAgICB9CisgICAgcmV0dXJuIG1fc21hbGxDYXBzRm9udERhdGE7Cit9CisKK2Jv
b2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25zdCBVQ2hhciogY2hhcmFj
dGVycywgaW50IGxlbmd0aCkgY29uc3QKK3sKKyAgLy8gVGhpcyB1c2VkIHRvIGJlIGltcGxlbWVu
dGVkIHdpdGggSU1MYW5nRm9udExpbmsyLCBidXQgc2luY2UgdGhhdCBjb2RlIGhhcworICAvLyBi
ZWVuIGRpc2FibGVkLCB0aGlzIHdvdWxkIGFsd2F5cyByZXR1cm4gZmFsc2UgYW55d2F5LgorICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkK
K3sKKyAgICAvLyBURVhUTUVUUklDUyBoYXZlIHRoaXMuICBTZXQgbV90cmVhdEFzRml4ZWRQaXRj
aCBiYXNlZCBvZmYgdGhhdC4KKyAgICBIREMgZGMgPSBHZXREQygoSFdORCkwKTsKKyAgICBIR0RJ
T0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKworICAgIC8v
IFllcywgdGhpcyBsb29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFj
dHVhbGx5IHNldCBpZiB0aGUgZm9udAorICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5i
ZWxpZXZhYmxlIGJ1dCB0cnVlLgorICAgIFRFWFRNRVRSSUMgdGV4dE1ldHJpYyA9IHswfTsKKyAg
ICBpZiAoIUdldFRleHRNZXRyaWNzKGRjLCAmdGV4dE1ldHJpYykpIHsKKyAgICAgICAgaWYgKENo
cm9taXVtQnJpZGdlOjplbnN1cmVGb250TG9hZGVkKG1fZm9udC5oZm9udCgpKSkgeworICAgICAg
ICAgICAgLy8gUmV0cnkgR2V0VGV4dE1ldHJpY3MuCisgICAgICAgICAgICAvLyBGSVhNRTogSGFu
ZGxlIGdyYWNlZnVsbHkgdGhlIGVycm9yIGlmIHRoaXMgY2FsbCBhbHNvIGZhaWxzLgorICAgICAg
ICAgICAgLy8gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vNjQwMS4KKyAgICAgICAgICAgIGlmICghR2V0
VGV4dE1ldHJpY3MoZGMsICZ0ZXh0TWV0cmljKSkKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2gg
PSAoKHRleHRNZXRyaWMudG1QaXRjaEFuZEZhbWlseSAmIFRNUEZfRklYRURfUElUQ0gpID09IDAp
OworCisgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKKyAgICBSZWxlYXNlREMoMCwgZGMp
OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBo
IGdseXBoKSBjb25zdAoreworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhHRElPQkogb2xk
Rm9udCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOworCisgICAgaW50IHdpZHRo
ID0gMDsKKyAgICBpZiAoIUdldENoYXJXaWR0aEkoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpKSB7
CisgICAgICAgIC8vIEFzayB0aGUgYnJvd3NlciB0byBwcmVsb2FkIHRoZSBmb250IGFuZCByZXRy
eS4KKyAgICAgICAgaWYgKENocm9taXVtQnJpZGdlOjplbnN1cmVGb250TG9hZGVkKG1fZm9udC5o
Zm9udCgpKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IEhhbmRsZSBncmFjZWZ1bGx5IHRoZSBl
cnJvciBpZiB0aGlzIGNhbGwgYWxzbyBmYWlscy4KKyAgICAgICAgICAgIC8vIFNlZSBodHRwOi8v
Y3JidWcuY29tLzY0MDEuCisgICAgICAgICAgICBpZiAoIUdldENoYXJXaWR0aEkoZGMsIGdseXBo
LCAxLCAwLCAmd2lkdGgpKQorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKKyAgICBS
ZWxlYXNlREMoMCwgZGMpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCk7
Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhTGludXguY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmUxNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNw
cApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250
Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRp
b24uaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIK
KworI2luY2x1ZGUgIlNrUGFpbnQuaCIKKyNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCisjaW5jbHVk
ZSAiU2tUaW1lLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gU21hbGxjYXBzIHZlcnNp
b25zIG9mIGZvbnRzIGFyZSA3MCUgdGhlIHNpemUgb2YgdGhlIG5vcm1hbCBmb250Lgorc3RhdGlj
IGNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZyYWN0aW9uID0gMC43ZjsKKwordm9pZCBTaW1wbGVGb250
RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAgICBTa1BhaW50IHBhaW50OworICAgIFNrUGFpbnQ6
OkZvbnRNZXRyaWNzIG1ldHJpY3M7CisKKyAgICBtX2ZvbnQuc2V0dXBQYWludCgmcGFpbnQpOwor
ICAgIHBhaW50LmdldEZvbnRNZXRyaWNzKCZtZXRyaWNzKTsKKworICAgIC8vIEJld2FyZSB0aG9z
ZSB3aG8gc3RlcCBoZXJlOiBUaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gbWF0Y2ggV2luMzIgZm9u
dAorICAgIC8vIG1ldHJpY3MgKmV4YWN0bHkqLgorICAgIGlmIChtZXRyaWNzLmZWRE1YTWV0cmlj
c1ZhbGlkKSB7CisgICAgICAgIG1fYXNjZW50ID0gbWV0cmljcy5mVkRNWEFzY2VudDsKKyAgICAg
ICAgbV9kZXNjZW50ID0gbWV0cmljcy5mVkRNWERlc2NlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgbV9hc2NlbnQgPSBTa1NjYWxhclJvdW5kKC1tZXRyaWNzLmZBc2NlbnQpOworICAgICAgICBt
X2Rlc2NlbnQgPSBTa1NjYWxhclJvdW5kKG1ldHJpY3MuZkhlaWdodCkgLSBtX2FzY2VudDsKKyAg
ICB9CisKKyAgICBpZiAobWV0cmljcy5mWEhlaWdodCkKKyAgICAgICAgbV94SGVpZ2h0ID0gbWV0
cmljcy5mWEhlaWdodDsKKyAgICBlbHNlCisgICAgICAgIC8vIGhhY2sgdGFrZW4gZnJvbSB0aGUg
V2luZG93cyBwb3J0CisgICAgICAgIG1feEhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihtX2Fz
Y2VudCkgKiAwLjU2OworCisgICAgbV9saW5lR2FwID0gU2tTY2FsYXJSb3VuZChtZXRyaWNzLmZM
ZWFkaW5nKTsKKyAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xp
bmVHYXA7CisKKyAgICAvLyBJbiBXZWJLaXQvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1w
bGVGb250RGF0YS5jcHAsIG1fc3BhY2VXaWR0aCBpcworICAgIC8vIGNhbGN1bGF0ZWQgZm9yIHVz
LCBidXQgd2UgbmVlZCB0byBjYWxjdWxhdGUgbV9tYXhDaGFyV2lkdGggYW5kCisgICAgLy8gbV9h
dmdDaGFyV2lkdGggaW4gb3JkZXIgZm9yIHRleHQgZW50cnkgd2lkZ2V0cyB0byBiZSBzaXplZCBj
b3JyZWN0bHkuCisKKyAgICBtX21heENoYXJXaWR0aCA9IFNrU2NhbGFyUm91bmQobWV0cmljcy5m
WFJhbmdlICogU2tTY2FsYXJSb3VuZChtX2ZvbnQuc2l6ZSgpKSk7CisKKyAgICBpZiAobWV0cmlj
cy5mQXZnQ2hhcldpZHRoKQorICAgICAgICBtX2F2Z0NoYXJXaWR0aCA9IFNrU2NhbGFyUm91bmQo
bWV0cmljcy5mQXZnQ2hhcldpZHRoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9hdmdDaGFyV2lk
dGggPSBtX3hIZWlnaHQ7CisKKyAgICAgICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5
cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOworCisgICAgICAg
IGlmIChnbHlwaFBhZ2VaZXJvKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgVUNoYXIzMiB4
X2NoYXIgPSAneCc7CisgICAgICAgICAgICBjb25zdCBHbHlwaCB4R2x5cGggPSBnbHlwaFBhZ2Va
ZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoeF9jaGFyKS5nbHlwaDsKKworICAgICAgICAgICAg
aWYgKHhHbHlwaCkKKyAgICAgICAgICAgICAgICBtX2F2Z0NoYXJXaWR0aCA9IHdpZHRoRm9yR2x5
cGgoeEdseXBoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKK30K
KworU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1f
c21hbGxDYXBzRm9udERhdGEpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgc21hbGxDYXBzU2l6ZSA9
IGxyb3VuZGYoZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6ZSgpICogc21hbGxDYXBzRnJhY3Rp
b24pOworICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKEZv
bnRQbGF0Zm9ybURhdGEobV9mb250LCBzbWFsbENhcHNTaXplKSk7CisgICAgfQorCisgICAgcmV0
dXJuIG1fc21hbGxDYXBzRm9udERhdGE7Cit9CisKK2Jvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRh
aW5zQ2hhcmFjdGVycyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QK
K3sKKyAgICBTa1BhaW50IHBhaW50OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhCdWZm
ZXJDb3VudCA9IDY0OworICAgIHVpbnQxNl90IGdseXBoc1ttYXhCdWZmZXJDb3VudF07CisKKyAg
ICBtX2ZvbnQuc2V0dXBQYWludCgmcGFpbnQpOworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhT
a1BhaW50OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKKworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7
CisgICAgICAgIGludCBuID0gU2tNaW4zMihsZW5ndGgsIFNLX0FSUkFZX0NPVU5UKGdseXBocykp
OworCisgICAgICAgIC8vIHRleHRUb0dseXBocyB0YWtlcyBhIGJ5dGUgY291bnQgc28gd2UgZG91
YmxlIHRoZSBjaGFyYWN0ZXIgY291bnQuCisgICAgICAgIGludCBjb3VudCA9IHBhaW50LnRleHRU
b0dseXBocyhjaGFyYWN0ZXJzLCBuICogMiwgZ2x5cGhzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoMCA9PSBnbHlwaHNbaV0pCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAvLyBtaXNzaW5nIGdseXBoCisgICAg
ICAgIH0KKworICAgICAgICBjaGFyYWN0ZXJzICs9IG47CisgICAgICAgIGxlbmd0aCAtPSBuOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRl
cm1pbmVQaXRjaCgpCit7CisgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IHBsYXRmb3JtRGF0YSgp
LmlzRml4ZWRQaXRjaCgpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0
aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIFNrQVNTRVJUKHNpemVvZihnbHlw
aCkgPT0gMik7ICAgLy8gY29tcGlsZS10aW1lIGFzc2VydAorCisgICAgU2tQYWludCBwYWludDsK
KworICAgIG1fZm9udC5zZXR1cFBhaW50KCZwYWludCk7CisKKyAgICBwYWludC5zZXRUZXh0RW5j
b2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKyAgICBTa1NjYWxhciB3aWR0
aCA9IHBhaW50Lm1lYXN1cmVUZXh0KCZnbHlwaCwgMik7CisgICAgCisgICAgcmV0dXJuIFNrU2Nh
bGFyVG9GbG9hdCh3aWR0aCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21p
dW1XaW4uY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBl
ckNocm9taXVtV2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThl
ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENv
cHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oIgor
CisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworVGhlbWVIZWxwZXJXaW46OlRoZW1lSGVscGVyV2luKEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCkKKyAgICA6IG1fb3Jn
Q29udGV4dChjb250ZXh0KQorICAgICwgbV9vcmdNYXRyaXgoY29udGV4dC0+Z2V0Q1RNKCkpCisg
ICAgLCBtX29yZ1JlY3QocmVjdCkKK3sKKyAgICBpZiAobV9vcmdNYXRyaXguYigpICE9IDAgfHwg
bV9vcmdNYXRyaXguYygpICE9IDApIHsgIC8vIENoZWNrIGZvciBza2V3LgorICAgICAgICAvLyBD
b21wbGljYXRlZCBlZmZlY3RzLCBtYWtlIGEgY29weSBhbmQgZHJhdyB0aGUgYml0bWFwIHRoZXJl
LgorICAgICAgICBtX3R5cGUgPSBDT1BZOworICAgICAgICBtX3JlY3Quc2V0U2l6ZShyZWN0LnNp
emUoKSk7CisKKyAgICAgICAgbV9uZXdCdWZmZXIuc2V0KEltYWdlQnVmZmVyOjpjcmVhdGUocmVj
dC5zaXplKCksIGZhbHNlKS5yZWxlYXNlKCkpOworCisgICAgICAgIC8vIFRoZW1lIGRyYXdpbmcg
bWVzc2VzIHdpdGggdGhlIHRyYW5zcGFyZW5jeS4KKyAgICAgICAgLy8gRklYTUU6IElkZWFsbHks
IHdlIHdvdWxkIGxlYXZlIHRoaXMgdHJhbnNwYXJlbnQsIGJ1dCBJIHdhcworICAgICAgICAvLyBo
YXZpbmcgcHJvYmxlbXMgd2l0aCBidXR0b24gZHJhd2luZywgc28gd2UgZmlsbCB3aXRoIHdoaXRl
LiBCdXR0b25zCisgICAgICAgIC8vIGxvb2tlZCBnb29kIHdpdGggdHJhbnNwYXJlbnQgaGVyZSBh
bmQgbm8gZml4aW5nIHVwIG9mIHRoZSBhbHBoYQorICAgICAgICAvLyBsYXRlciwgYnV0IHRleHQg
YXJlYXMgZGlkbid0LiBUaGlzIG1ha2VzIHRleHQgYXJlYXMgbG9vayBnb29kIGJ1dAorICAgICAg
ICAvLyBnaXZlcyBidXR0b25zIGEgd2hpdGUgaGFsby4gSXMgdGhlcmUgYSB3YXkgdG8gZml4IHRo
aXM/IEkgdGhpbmsKKyAgICAgICAgLy8gYnV0dG9ucyBhY3R1YWxseSBoYXZlIGFudGlhbGlzZWQg
ZWRnZXMgd2hpY2ggaXMganVzdCBub3QgcG9zc2libGUKKyAgICAgICAgLy8gdG8gaGFuZGxlIG9u
IGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBnaXZlbiB0aGF0IGl0IG1lc3NlcyB3aXRoIHRoZQor
ICAgICAgICAvLyBhbHBoYSBjaGFubmVsLgorICAgICAgICBGbG9hdFJlY3QgbmV3Q29udGV4dFJl
Y3QoMCwgMCwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICAgICAgR3JhcGhpY3ND
b250ZXh0KiBuZXdDb250ZXh0ID0gbV9uZXdCdWZmZXItPmNvbnRleHQoKTsKKyAgICAgICAgbmV3
Q29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7CisgICAgICAgIG5ld0NvbnRleHQt
PmZpbGxSZWN0KG5ld0NvbnRleHRSZWN0KTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKG1fb3JnTWF0cml4LmEoKSAhPSAxLjAgfHwgbV9vcmdNYXRyaXguZCgpICE9IDEuMCkg
eyAgLy8gQ2hlY2sgZm9yIHNjYWxlLgorICAgICAgICAvLyBPbmx5IGEgc2NhbGluZyBpcyBhcHBs
aWVkLgorICAgICAgICBtX3R5cGUgPSBTQ0FMRTsKKworICAgICAgICAvLyBTYXZlIHRoZSB0cmFu
c2Zvcm1lZCBjb29yZGluYXRlcyB0byBkcmF3LgorICAgICAgICBtX3JlY3QgPSBtX29yZ01hdHJp
eC5tYXBSZWN0KHJlY3QpOworICAgICAgICAKKyAgICAgICAgbV9vcmdDb250ZXh0LT5zYXZlKCk7
CisgICAgICAgIG1fb3JnQ29udGV4dC0+Y29uY2F0Q1RNKG1fb3JnQ29udGV4dC0+Z2V0Q1RNKCku
aW52ZXJzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdGhpbmcgaW50
ZXJlc3RpbmcuCisgICAgbV9yZWN0ID0gcmVjdDsKKyAgICBtX3R5cGUgPSBPUklHSU5BTDsKK30K
KworVGhlbWVIZWxwZXJXaW46On5UaGVtZUhlbHBlcldpbigpCit7CisgICAgc3dpdGNoIChtX3R5
cGUpIHsKKyAgICBjYXNlIFNDQUxFOgorICAgICAgICBtX29yZ0NvbnRleHQtPnJlc3RvcmUoKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT1BZOiB7CisgICAgICAgIC8vIENvcHkgdGhlIGR1
cGxpY2F0ZSBiaXRtYXAgd2l0aCBvdXIgY29udHJvbCB0byB0aGUgb3JpZ2luYWwgY2FudmFzLgor
ICAgICAgICBGbG9hdFJlY3QgZGVzdFJlY3QobV9vcmdSZWN0KTsKKyAgICAgICAgbV9uZXdCdWZm
ZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT4KKyAgICAgICAgICAg
IGdldFRvcFBsYXRmb3JtRGV2aWNlKCkuZml4dXBBbHBoYUJlZm9yZUNvbXBvc2l0aW5nKCk7Cisg
ICAgICAgIG1fb3JnQ29udGV4dC0+ZHJhd0ltYWdlKG1fbmV3QnVmZmVyLT5pbWFnZSgpLCBkZXN0
UmVjdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9SSUdJTkFMOgorICAgICAg
ICBicmVhazsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21pdW1X
aW4uaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJv
bWl1bVdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzFmYjQKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RoZW1l
SGVscGVyQ2hyb21pdW1XaW4uaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDA4LCAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGhl
bWVIZWxwZXJXaW5faAorI2RlZmluZSBUaGVtZUhlbHBlcldpbl9oCisKKyNpbmNsdWRlICJUcmFu
c2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAi
SW50UmVjdC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBJbnRSZWN0OworCisvLyBIZWxwcyBk
cmF3aW5nIHRoZW1lIGVsZW1lbnRzIGxpa2UgYnV0dG9ucyBhbmQgc2Nyb2xsIGJhcnMuIFRoaXMg
d2lsbCBoYW5kbGUKKy8vIHRyYW5zbGF0aW9ucyBhbmQgc2NhbGluZ3MgdGhhdCBXaW5kb3dzIG1p
Z2h0IG5vdCwgYnkgZWl0aGVyIG1ha2luZyBXaW5kb3dzCisvLyBkcmF3IHRoZSBhcHByb3ByaWF0
ZSBzaXplZCBjb250cm9sLCBvciBieSByZW5kZXJpbmcgaXQgaW50byBhbiBvZmYtc2NyZWVuCisv
LyBjb250ZXh0IGFuZCB0cmFuc2Zvcm1pbmcgaXQgb3Vyc2VsdmVzLgorY2xhc3MgVGhlbWVIZWxw
ZXJXaW4geworICAgIGVudW0gVHlwZSB7CisgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgY2Fu
dmFzIHdpdGggbm8gY2hhbmdlcy4gVGhpcyBpcyB0aGUgbm9ybWFsIG1vZGUuCisgICAgICAgIE9S
SUdJTkFMLAorCisgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgY2FudmFzIGJ1dCBzY2FsZSB0
aGUgcmVjdGFuZ2xlIG9mIHRoZSBjb250cm9sIHNvCisgICAgICAgIC8vIHRoYXQgaXQgd2lsbCBi
ZSB0aGUgY29ycmVjdCBzaXplLCB1bmRvaW5nIGFueSBzY2FsZSBhbHJlYWR5IG9uIHRoZQorICAg
ICAgICAvLyBjYW52YXMuIFRoaXMgd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YganVzdCBkcmF3aW5n
IHRoZSBjb250cm9sIGJpZ2dlcgorICAgICAgICAvLyBvciBzbWFsbGVyIGFuZCBub3QgYWN0dWFs
bHkgZXhwYW5kaW5nIG9yIGNvbnRyYWN0aW5nIHRoZSBwaXhlbHMgaW4KKyAgICAgICAgLy8gaXQu
IFRoaXMgdXN1YWxseSBsb29rcyBiZXR0ZXIuCisgICAgICAgIFNDQUxFLAorCisgICAgICAgIC8v
IE1ha2UgYSBjb3B5IG9mIHRoZSBjb250cm9sIGFuZCB0aGVuIHRyYW5zZm9ybSBpdCBvdXJzZWx2
ZXMgYWZ0ZXIKKyAgICAgICAgLy8gV2luZG93cyBkcmF3cyBpdC4gVGhpcyBhbGxvd3MgdXMgdG8g
Z2V0IGNvbXBsZXggZWZmZWN0cy4KKyAgICAgICAgQ09QWSwKKyAgICB9OworCitwdWJsaWM6Cisg
ICAgLy8gUHJlcGFyZXMgZHJhd2luZyBhIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcmVjdCB0byB0
aGUgZ2l2ZW4gY29udGV4dC4KKyAgICBUaGVtZUhlbHBlcldpbihHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QpOworICAgIH5UaGVtZUhlbHBlcldpbigpOworCisg
ICAgLy8gUmV0dXJucyB0aGUgY29udGV4dCB0byBkcmF3IHRoZSBjb250cm9sIGludG8sIHdoaWNo
IG1heSBiZSB0aGUgb3JpZ2luYWwKKyAgICAvLyBvciB0aGUgY29weSwgZGVwZW5kaW5nIG9uIHRo
ZSBtb2RlLgorICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCgpCisgICAgeworICAgICAgICBy
ZXR1cm4gbV9uZXdCdWZmZXIuZ2V0KCkgPyBtX25ld0J1ZmZlci0+Y29udGV4dCgpIDogbV9vcmdD
b250ZXh0OworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIHJlY3RhbmdsZSBpbiB3aGljaCB0
byBkcmF3IGludG8gdGhlIGNhbnZhcygpIGJ5IFdpbmRvd3MuCisgICAgY29uc3QgSW50UmVjdCYg
cmVjdCgpIHsgcmV0dXJuIG1fcmVjdDsgfQorCitwcml2YXRlOgorICAgIFR5cGUgbV90eXBlOwor
CisgICAgLy8gVGhlIG9yaWdpbmFsIGNhbnZhcyB0byB3cm90ZSB0by4gTm90IG93bmVkIGJ5IHRo
aXMgY2xhc3MuCisgICAgR3JhcGhpY3NDb250ZXh0KiBtX29yZ0NvbnRleHQ7CisgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggbV9vcmdNYXRyaXg7CisgICAgSW50UmVjdCBtX29yZ1JlY3Q7CisKKyAg
ICAvLyBXaGVuIG1fdHlwZSA9PSBDT1BZLCB0aGlzIHdpbGwgYmUgYSBuZXcgc3VyZmFjZSBvd25l
ZCBieSB0aGlzIGNsYXNzIHRoYXQKKyAgICAvLyByZXByZXNlbnRzIHRoZSBjb3B5LgorICAgIE93
blB0cjxJbWFnZUJ1ZmZlcj4gbV9uZXdCdWZmZXI7CisKKyAgICAvLyBUaGUgY29udHJvbCByZWN0
YW5nbGUgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgY2FudmFzKCkuCisgICAgSW50UmVjdCBt
X3JlY3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIFRoZW1l
SGVscGVyV2luX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVW5pc2NyaWJlSGVscGVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVW5pc2NyaWJlSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li4xN2Q4NmVjCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9VbmlzY3JpYmVIZWxwZXIuY3BwCkBAIC0wLDAgKzEsOTAyIEBACisvKgorICogQ29w
eXJpZ2h0IChjKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICog
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJVbmlzY3JpYmVIZWxwZXIu
aCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIkZvbnRVdGlsc0Nocm9taXVt
V2luLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VlIHdoZXJlIHdvcmQgc3BhY2luZyBz
aG91bGQgYmUgYXBwbGllZCBpbnNpZGUKKy8vIHJ1bnMuIE5vdGUgdGhhdCB0aGlzIG11c3QgbWF0
Y2ggRm9udDo6dHJlYXRBc1NwYWNlIHNvIHdlIGFsbCBhZ3JlZSB3aGVyZQorLy8gYW5kIGhvdyBt
dWNoIHNwYWNlIHRoaXMgaXMsIHNvIHdlIGRvbid0IHdhbnQgdG8gZG8gbW9yZSBnZW5lcmFsIFVu
aWNvZGUKKy8vICJpcyB0aGlzIGEgd29yZCBicmVhayIgdGhpbmcuCitzdGF0aWMgYm9vbCB0cmVh
dEFzU3BhY2UoVUNoYXIgYykKK3sKKyAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwg
YyA9PSAnXG4nIHx8IGMgPT0gMHgwMEEwOworfQorCisvLyBTQ1JJUFRfRk9OVFBST1BFUlRJRVMg
Y29udGFpbnMgZ2x5cGggaW5kaWNlcyBmb3IgZGVmYXVsdCwgaW52YWxpZAorLy8gYW5kIGJsYW5r
IGdseXBocy4gSnVzdCBiZWNhdXNlIFNjcmlwdFNoYXBlIHN1Y2NlZWRzIGRvZXMgbm90IG1lYW4K
Ky8vIHRoYXQgYSB0ZXh0IHJ1biBpcyByZW5kZXJlZCBjb3JyZWN0bHkuIFNvbWUgY2hhcmFjdGVy
cyBtYXkgYmUgcmVuZGVyZWQKKy8vIHdpdGggZGVmYXVsdC9pbnZhbGlkL2JsYW5rIGdseXBocy4g
VGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBnbHlwaAorLy8gYXJyYXkgcmV0dXJu
ZWQgYnkgU2NyaXB0U2hhcGUgY29udGFpbnMgYW55IG9mIHRob3NlIGdseXBocyB0byBtYWtlCisv
LyBzdXJlIHRoYXQgdGhlIHRleHQgcnVuIGlzIHJlbmRlcmVkIHN1Y2Nlc3NmdWxseS4KK3N0YXRp
YyBib29sIGNvbnRhaW5zTWlzc2luZ0dseXBocyhXT1JEICpnbHlwaHMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIHByb3BlcnRpZXMpCit7CisgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoZ2x5cGhzW2ldID09
IHByb3BlcnRpZXMtPndnRGVmYXVsdCAKKyAgICAgICAgICAgIHx8IChnbHlwaHNbaV0gPT0gcHJv
cGVydGllcy0+d2dJbnZhbGlkCisgICAgICAgICAgICAmJiBnbHlwaHNbaV0gIT0gcHJvcGVydGll
cy0+d2dCbGFuaykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKKy8vIEhGT05UIGlzIHRoZSAnaW5jYXJuYXRpb24nIG9mICdldmVyeXRo
aW5nJyBhYm91dCBmb250LCBidXQgaXQncyBhbiBvcGFxdWUKKy8vIGhhbmRsZSBhbmQgd2UgY2Fu
J3QgZGlyZWN0bHkgcXVlcnkgaXQgdG8gbWFrZSBhIG5ldyBIRk9OVCBzaGFyaW5nCisvLyBpdHMg
Y2hhcmFjdGVyaXN0aWNzIChoZWlnaHQsIHN0eWxlLCBldGMpIGV4Y2VwdCBmb3IgZmFtaWx5IG5h
bWUuCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgR2V0T2JqZWN0IHRvIGNvbnZlcnQgSEZPTlQgYmFj
ayB0byBMT0dGT05ULAorLy8gcmVzZXRzIHRoZSBmaWVsZHMgb2YgTE9HRk9OVCBhbmQgY2FsY3Vs
YXRlcyBzdHlsZSB0byB1c2UgbGF0ZXIKKy8vIGZvciB0aGUgY3JlYXRpb24gb2YgYSBmb250IGlk
ZW50aWNhbCB0byBIRk9OVCBvdGhlciB0aGFuIGZhbWlseSBuYW1lLgorc3RhdGljIHZvaWQgc2V0
TG9nRm9udEFuZFN0eWxlKEhGT05UIGhmb250LCBMT0dGT05UICpsb2dmb250LCBpbnQgKnN0eWxl
KQoreworICAgIEFTU0VSVChoZm9udCAmJiBsb2dmb250KTsKKyAgICBpZiAoIWhmb250IHx8ICFs
b2dmb250KQorICAgICAgICByZXR1cm47CisKKyAgICBHZXRPYmplY3QoaGZvbnQsIHNpemVvZihM
T0dGT05UKSwgbG9nZm9udCk7CisgICAgLy8gV2UgcmVzZXQgdGhlc2UgZmllbGRzIHRvIHZhbHVl
cyBhcHByb3ByaWF0ZSBmb3IgQ3JlYXRlRm9udEluZGlyZWN0LgorICAgIC8vIHdoaWxlIGtlZXBp
bmcgbGZIZWlnaHQsIHdoaWNoIGlzIHRoZSBtb3N0IGltcG9ydGFudCB2YWx1ZSBpbiBjcmVhdGlu
ZworICAgIC8vIGEgbmV3IGZvbnQgc2ltaWxhciB0byBoZm9udC4KKyAgICBsb2dmb250LT5sZldp
ZHRoID0gMDsKKyAgICBsb2dmb250LT5sZkVzY2FwZW1lbnQgPSAwOworICAgIGxvZ2ZvbnQtPmxm
T3JpZW50YXRpb24gPSAwOworICAgIGxvZ2ZvbnQtPmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNF
VDsKKyAgICBsb2dmb250LT5sZk91dFByZWNpc2lvbiA9IE9VVF9UVF9PTkxZX1BSRUNJUzsKKyAg
ICBsb2dmb250LT5sZlF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFk7ICAvLyBIb25vciB1c2VyJ3Mg
ZGVza3RvcCBzZXR0aW5ncy4KKyAgICBsb2dmb250LT5sZlBpdGNoQW5kRmFtaWx5ID0gREVGQVVM
VF9QSVRDSCB8IEZGX0RPTlRDQVJFOworICAgIGlmIChzdHlsZSkKKyAgICAgICAgKnN0eWxlID0g
Z2V0U3R5bGVGcm9tTG9nZm9udChsb2dmb250KTsKK30KKworVW5pc2NyaWJlSGVscGVyOjpVbmlz
Y3JpYmVIZWxwZXIoY29uc3QgVUNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpbnQgaW5wdXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvb2wgaXNSdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhGT05UIGhmb250
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1JJUFRfQ0FDSEUqIHNjcmlwdENh
Y2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1JJUFRfRk9OVFBST1BFUlRJ
RVMqIGZvbnRQcm9wZXJ0aWVzKQorICAgIDogbV9pbnB1dChpbnB1dCkKKyAgICAsIG1faW5wdXRM
ZW5ndGgoaW5wdXRMZW5ndGgpCisgICAgLCBtX2lzUnRsKGlzUnRsKQorICAgICwgbV9oZm9udCho
Zm9udCkKKyAgICAsIG1fc2NyaXB0Q2FjaGUoc2NyaXB0Q2FjaGUpCisgICAgLCBtX2ZvbnRQcm9w
ZXJ0aWVzKGZvbnRQcm9wZXJ0aWVzKQorICAgICwgbV9kaXJlY3Rpb25hbE92ZXJyaWRlKGZhbHNl
KQorICAgICwgbV9pbmhpYml0TGlnYXRlKGZhbHNlKQorICAgICwgbV9sZXR0ZXJTcGFjaW5nKDAp
CisgICAgLCBtX3NwYWNlV2lkdGgoMCkKKyAgICAsIG1fd29yZFNwYWNpbmcoMCkKKyAgICAsIG1f
YXNjZW50KDApCit7CisgICAgbV9sb2dmb250LmxmRmFjZU5hbWVbMF0gPSAwOworfQorCitVbmlz
Y3JpYmVIZWxwZXI6On5VbmlzY3JpYmVIZWxwZXIoKQoreworfQorCit2b2lkIFVuaXNjcmliZUhl
bHBlcjo6aW5pdFdpdGhPcHRpb25hbExlbmd0aFByb3RlY3Rpb24oYm9vbCBsZW5ndGhQcm90ZWN0
aW9uKQoreworICAgIC8vIFdlIGNhcCB0aGUgaW5wdXQgbGVuZ3RoIGFuZCBqdXN0IGRvbid0IGRv
IGFueXRoaW5nLiBXZSdsbCBhbGxvY2F0ZSBhIGxvdAorICAgIC8vIG9mIHRoaW5ncyBvZiB0aGUg
c2l6ZSBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIHNvIHRoZSBhbGxvY2F0ZWQKKyAgICAv
LyBtZW1vcnkgd2lsbCBiZSBzZXZlcmFsIHRpbWVzIHRoZSBpbnB1dCBsZW5ndGguIFBsdXMgc2hh
cGluZyBzdWNoIGEgbGFyZ2UKKyAgICAvLyBidWZmZXIgbWF5IGJlIGEgZm9ybSBvZiBkZW5pYWwg
b2Ygc2VydmljZS4gTm8gbGVnaXRpbWF0ZSB0ZXh0IHNob3VsZCBiZQorICAgIC8vIHRoaXMgbG9u
Zy4gIEl0IGFsc28gYXBwZWFycyB0aGF0IFVuaXNjcmliZSBmbGF0bHkgcmVqZWN0cyB2ZXJ5IGxv
bmcKKyAgICAvLyBzdHJpbmdzLCBzbyB3ZSBkb24ndCBsb3NlIGFueXRoaW5nIGJ5IGRvaW5nIHRo
aXMuCisgICAgLy8KKyAgICAvLyBUaGUgaW5wdXQgbGVuZ3RoIHByb3RlY3Rpb24gbWF5IGJlIGRp
c2FibGVkIGJ5IHRoZSB1bml0IHRlc3RzIHRvIGNhdXNlCisgICAgLy8gYW4gZXJyb3IgY29uZGl0
aW9uLgorICAgIHN0YXRpYyBjb25zdCBpbnQga01heElucHV0TGVuZ3RoID0gNjU1MzU7CisgICAg
aWYgKG1faW5wdXRMZW5ndGggPT0gMCB8fCAobGVuZ3RoUHJvdGVjdGlvbiAmJiBtX2lucHV0TGVu
Z3RoID4ga01heElucHV0TGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZmlsbFJ1bnMo
KTsKKyAgICBmaWxsU2hhcGVzKCk7CisgICAgZmlsbFNjcmVlbk9yZGVyKCk7Cit9CisKK2ludCBV
bmlzY3JpYmVIZWxwZXI6OndpZHRoKCkgY29uc3QKK3sKKyAgICBpbnQgd2lkdGggPSAwOworICAg
IGZvciAoaW50IGl0ZW1JbmRleCA9IDA7IGl0ZW1JbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9y
dW5zLnNpemUoKSk7IGl0ZW1JbmRleCsrKQorICAgICAgICB3aWR0aCArPSBhZHZhbmNlRm9ySXRl
bShpdGVtSW5kZXgpOworICAgIHJldHVybiB3aWR0aDsKK30KKwordm9pZCBVbmlzY3JpYmVIZWxw
ZXI6Omp1c3RpZnkoaW50IGFkZGl0aW9uYWxTcGFjZSkKK3sKKyAgICAvLyBDb3VudCB0aGUgdG90
YWwgbnVtYmVyIG9mIGdseXBocyB3ZSBoYXZlIHNvIHdlIGtub3cgaG93IGJpZyB0byBtYWtlIHRo
ZQorICAgIC8vIGJ1ZmZlcnMgYmVsb3cuCisgICAgaW50IHRvdGFsR2x5cGhzID0gMDsKKyAgICBm
b3IgKHNpemVfdCBydW4gPSAwOyBydW4gPCBtX3J1bnMuc2l6ZSgpOyBydW4rKykgeworICAgICAg
ICBpbnQgcnVuSW5kZXggPSBtX3NjcmVlbk9yZGVyW3J1bl07CisgICAgICAgIHRvdGFsR2x5cGhz
ICs9IHN0YXRpY19jYXN0PGludD4obV9zaGFwZXNbcnVuSW5kZXhdLmdseXBoTGVuZ3RoKCkpOwor
ICAgIH0KKyAgICBpZiAodG90YWxHbHlwaHMgPT0gMCkKKyAgICAgICAgcmV0dXJuOyAgLy8gTm90
aGluZyB0byBkby4KKworICAgIC8vIFdlIG1ha2Ugb25lIGJpZyBidWZmZXIgaW4gc2NyZWVuIG9y
ZGVyIG9mIGFsbCB0aGUgZ2x5cGhzIHdlIGFyZSBkcmF3aW5nCisgICAgLy8gYWNyb3NzIHJ1bnMg
c28gdGhhdCB0aGUganVzdGlmaWNhdGlvbiBmdW5jdGlvbiB3aWxsIGFkanVzdCBldmVubHkgYWNy
b3NzCisgICAgLy8gYWxsIGdseXBocy4KKyAgICBWZWN0b3I8U0NSSVBUX1ZJU0FUVFIsIDY0PiB2
aXN1YWxBdHRyaWJ1dGVzOworICAgIHZpc3VhbEF0dHJpYnV0ZXMucmVzaXplKHRvdGFsR2x5cGhz
KTsKKyAgICBWZWN0b3I8aW50LCA2ND4gYWR2YW5jZXM7CisgICAgYWR2YW5jZXMucmVzaXplKHRv
dGFsR2x5cGhzKTsKKyAgICBWZWN0b3I8aW50LCA2ND4ganVzdGlmeTsKKyAgICBqdXN0aWZ5LnJl
c2l6ZSh0b3RhbEdseXBocyk7CisKKyAgICAvLyBCdWlsZCB0aGUgcGFja2VkIGlucHV0LgorICAg
IGludCBkZXN0SW5kZXggPSAwOworICAgIGZvciAoc2l6ZV90IHJ1biA9IDA7IHJ1biA8IG1fcnVu
cy5zaXplKCk7IHJ1bisrKSB7CisgICAgICAgIGludCBydW5JbmRleCA9IG1fc2NyZWVuT3JkZXJb
cnVuXTsKKyAgICAgICAgY29uc3QgU2hhcGluZyYgc2hhcGluZyA9IG1fc2hhcGVzW3J1bkluZGV4
XTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYXBpbmcuZ2x5cGhMZW5ndGgoKTsg
aSsrLCBkZXN0SW5kZXgrKykgeworICAgICAgICAgICAgbWVtY3B5KCZ2aXN1YWxBdHRyaWJ1dGVz
W2Rlc3RJbmRleF0sICZzaGFwaW5nLm1fdmlzdWFsQXR0cmlidXRlc1tpXSwKKyAgICAgICAgICAg
ICAgICAgICBzaXplb2YoU0NSSVBUX1ZJU0FUVFIpKTsKKyAgICAgICAgICAgIGFkdmFuY2VzW2Rl
c3RJbmRleF0gPSBzaGFwaW5nLm1fYWR2YW5jZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIFRoZSBkb2N1bWVudGF0aW9uIGZvciBTY3JpcHRqdXN0aWZ5IGlzIHdyb25nLCB0aGUgcGFy
YW1ldGVyIGlzIHRoZSBzcGFjZQorICAgIC8vIHRvIGFkZCBhbmQgbm90IHRoZSB3aWR0aCBvZiB0
aGUgY29sdW1uIHlvdSB3YW50LgorICAgIGNvbnN0IGludCBtaW5LYXNoaWRhID0gMTsgIC8vIEhv
dyBkbyB3ZSBkZWNpZGUgd2hhdCB0aGlzIHNob3VsZCBiZT8KKyAgICBTY3JpcHRKdXN0aWZ5KCZ2
aXN1YWxBdHRyaWJ1dGVzWzBdLCAmYWR2YW5jZXNbMF0sIHRvdGFsR2x5cGhzLAorICAgICAgICAg
ICAgICAgICAgYWRkaXRpb25hbFNwYWNlLCBtaW5LYXNoaWRhLCAmanVzdGlmeVswXSk7CisKKyAg
ICAvLyBOb3cgd2UgaGF2ZSB0byB1bnBhY2sgdGhlIGp1c3RpZmljYXRpb24gYW1vdW50cyBiYWNr
IGludG8gdGhlIHJ1bnMgc28KKyAgICAvLyB0aGUgZ2x5cGggaW5kaWNlcyBtYXRjaC4KKyAgICBp
bnQgZ2xvYmFsR2x5cGhJbmRleCA9IDA7CisgICAgZm9yIChzaXplX3QgcnVuID0gMDsgcnVuIDwg
bV9ydW5zLnNpemUoKTsgcnVuKyspIHsKKyAgICAgICAgaW50IHJ1bkluZGV4ID0gbV9zY3JlZW5P
cmRlcltydW5dOworICAgICAgICBTaGFwaW5nJiBzaGFwaW5nID0gbV9zaGFwZXNbcnVuSW5kZXhd
OworCisgICAgICAgIHNoYXBpbmcubV9qdXN0aWZ5LnJlc2l6ZShzaGFwaW5nLmdseXBoTGVuZ3Ro
KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYXBpbmcuZ2x5cGhMZW5ndGgoKTsg
aSsrLCBnbG9iYWxHbHlwaEluZGV4KyspCisgICAgICAgICAgICBzaGFwaW5nLm1fanVzdGlmeVtp
XSA9IGp1c3RpZnlbZ2xvYmFsR2x5cGhJbmRleF07CisgICAgfQorfQorCitpbnQgVW5pc2NyaWJl
SGVscGVyOjpjaGFyYWN0ZXJUb1goaW50IG9mZnNldCkgY29uc3QKK3sKKyAgICBIUkVTVUxUIGhy
OworICAgIEFTU0VSVChvZmZzZXQgPD0gbV9pbnB1dExlbmd0aCk7CisKKyAgICAvLyBPdXIgYWxn
b3JpdGhtIGlzIHRvIHRyYXZlcnNlIHRoZSBpdGVtcyBpbiBzY3JlZW4gb3JkZXIgZnJvbSBsZWZ0
IHRvCisgICAgLy8gcmlnaHQsIGFkZGluZyBpbiBlYWNoIGl0ZW0ncyBzY3JlZW4gd2lkdGggdW50
aWwgd2UgZmluZCB0aGUgaXRlbSB3aXRoCisgICAgLy8gdGhlIHJlcXVlc3RlZCBjaGFyYWN0ZXIg
aW4gaXQuCisgICAgaW50IHdpZHRoID0gMDsKKyAgICBmb3IgKHNpemVfdCBzY3JlZW5JbmRleCA9
IDA7IHNjcmVlbkluZGV4IDwgbV9ydW5zLnNpemUoKTsgc2NyZWVuSW5kZXgrKykgeworICAgICAg
ICAvLyBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhpcyBydW4uCisgICAgICAgIGludCBpdGVtSW5k
ZXggPSBtX3NjcmVlbk9yZGVyW3NjcmVlbkluZGV4XTsKKyAgICAgICAgY29uc3QgU0NSSVBUX0lU
RU0mIGl0ZW0gPSBtX3J1bnNbaXRlbUluZGV4XTsKKyAgICAgICAgY29uc3QgU2hhcGluZyYgc2hh
cGluZyA9IG1fc2hhcGVzW2l0ZW1JbmRleF07CisgICAgICAgIGludCBpdGVtTGVuZ3RoID0gc2hh
cGluZy5jaGFyTGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKG9mZnNldCA+PSBpdGVtLmlDaGFyUG9z
ICYmIG9mZnNldCA8PSBpdGVtLmlDaGFyUG9zICsgaXRlbUxlbmd0aCkgeworICAgICAgICAgICAg
Ly8gQ2hhcmFjdGVyIG9mZnNldCBpcyBpbiB0aGlzIHJ1bi4KKyAgICAgICAgICAgIGludCBjaGFy
TGVuZ3RoID0gb2Zmc2V0IC0gaXRlbS5pQ2hhclBvczsKKworICAgICAgICAgICAgaW50IGN1clgg
PSAwOworICAgICAgICAgICAgaHIgPSBTY3JpcHRDUHRvWChjaGFyTGVuZ3RoLCBGQUxTRSwgaXRl
bUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZy5nbHlwaExlbmd0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcGluZy5tX2xvZ3NbMF0sICZz
aGFwaW5nLm1fdmlzdWFsQXR0cmlidXRlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2hhcGluZy5lZmZlY3RpdmVBZHZhbmNlcygpLCAmaXRlbS5hLCAmY3VyWCk7CisgICAgICAg
ICAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAg
ICAgICAgd2lkdGggKz0gY3VyWCArIHNoYXBpbmcubV9wcmVQYWRkaW5nOworICAgICAgICAgICAg
QVNTRVJUKHdpZHRoID49IDApOworICAgICAgICAgICAgcmV0dXJuIHdpZHRoOworICAgICAgICB9
CisKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBpdGVtLgorICAgICAgICB3aWR0aCArPSBh
ZHZhbmNlRm9ySXRlbShpdGVtSW5kZXgpOworICAgIH0KKyAgICBBU1NFUlQod2lkdGggPj0gMCk7
CisgICAgcmV0dXJuIHdpZHRoOworfQorCitpbnQgVW5pc2NyaWJlSGVscGVyOjp4VG9DaGFyYWN0
ZXIoaW50IHgpIGNvbnN0Cit7CisgICAgLy8gV2UgaXRlcmF0ZSBpbiBzY3JlZW4gb3JkZXIgdW50
aWwgd2UgZmluZCB0aGUgaXRlbSB3aXRoIHRoZSBnaXZlbiBwaXhlbAorICAgIC8vIHBvc2l0aW9u
IGluIGl0LiBXaGVuIHdlIGZpbmQgdGhhdCBndXksIHdlIGFzayBVbmlzY3JpYmUgZm9yIHRoZQor
ICAgIC8vIGNoYXJhY3RlciBpbmRleC4KKyAgICBIUkVTVUxUIGhyOworICAgIGZvciAoc2l6ZV90
IHNjcmVlbkluZGV4ID0gMDsgc2NyZWVuSW5kZXggPCBtX3J1bnMuc2l6ZSgpOyBzY3JlZW5JbmRl
eCsrKSB7CisgICAgICAgIGludCBpdGVtSW5kZXggPSBtX3NjcmVlbk9yZGVyW3NjcmVlbkluZGV4
XTsKKyAgICAgICAgaW50IGl0ZW1BZHZhbmNlID0gYWR2YW5jZUZvckl0ZW0oaXRlbUluZGV4KTsK
KworICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHJ1biBtYXkgYmUgZW1wdHkgaWYgc2hhcGluZyBm
YWlsZWQsIHNvIHdlIHdhbnQgdG8gc2tpcAorICAgICAgICAvLyBvdmVyIGl0LgorICAgICAgICBj
b25zdCBTaGFwaW5nJiBzaGFwaW5nID0gbV9zaGFwZXNbaXRlbUluZGV4XTsKKyAgICAgICAgaW50
IGl0ZW1MZW5ndGggPSBzaGFwaW5nLmNoYXJMZW5ndGgoKTsKKyAgICAgICAgaWYgKHggPD0gaXRl
bUFkdmFuY2UgJiYgaXRlbUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0
ZWQgb2Zmc2V0IGlzIHdpdGhpbiB0aGlzIGl0ZW0uCisgICAgICAgICAgICBjb25zdCBTQ1JJUFRf
SVRFTSYgaXRlbSA9IG1fcnVuc1tpdGVtSW5kZXhdOworCisgICAgICAgICAgICAvLyBBY2NvdW50
IGZvciB0aGUgbGVhZGluZyBzcGFjZSB3ZSd2ZSBhZGRlZCB0byB0aGlzIHJ1biB0aGF0CisgICAg
ICAgICAgICAvLyBVbmlzY3JpYmUgZG9lc24ndCBrbm93IGFib3V0LgorICAgICAgICAgICAgeCAt
PSBzaGFwaW5nLm1fcHJlUGFkZGluZzsKKworICAgICAgICAgICAgaW50IGNoYXJYID0gMDsKKyAg
ICAgICAgICAgIGludCB0cmFpbGluZzsKKyAgICAgICAgICAgIGhyID0gU2NyaXB0WHRvQ1AoeCwg
aXRlbUxlbmd0aCwgc2hhcGluZy5nbHlwaExlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmc2hhcGluZy5tX2xvZ3NbMF0sICZzaGFwaW5nLm1fdmlzdWFsQXR0cmlidXRlc1sw
XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZy5lZmZlY3RpdmVBZHZhbmNl
cygpLCAmaXRlbS5hLCAmY2hhclgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFp
bGluZyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGlzIHdpdGhpbiB0
aGUgaXRlbS4gV2UgbmVlZCB0byBhZGQgdGhlCisgICAgICAgICAgICAvLyBpdGVtJ3Mgb2Zmc2V0
IHRvIHRyYW5zZm9ybSBpdCBpbnRvIHRoZSBzcGFjZSBvZiB0aGUgVGV4dFJ1bgorICAgICAgICAg
ICAgcmV0dXJuIGNoYXJYICsgaXRlbS5pQ2hhclBvczsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IFRoZSBvZmZzZXQgaXMgYmV5b25kIHRoaXMgaXRlbSwgYWNjb3VudCBmb3IgaXRzIGxlbmd0aCBh
bmQgbW92ZSBvbi4KKyAgICAgICAgeCAtPSBpdGVtQWR2YW5jZTsKKyAgICB9CisKKyAgICAvLyBF
cnJvciBjb25kaXRpb24sIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyBpZiB3ZSBkb24ndCBoYXZl
IHRoYXQgWAorICAgIC8vIHBvc2l0aW9uIGluIGFueSBvZiBvdXIgaXRlbXMuCisgICAgcmV0dXJu
IDA7Cit9CisKK3ZvaWQgVW5pc2NyaWJlSGVscGVyOjpkcmF3KEhEQyBkYywgaW50IHgsIGludCB5
LCBpbnQgZnJvbSwgaW50IHRvKQoreworICAgIEhHRElPQkogb2xkRm9udCA9IDA7CisgICAgaW50
IGN1clggPSB4OworICAgIGJvb2wgZmlyc3RSdW4gPSB0cnVlOworCisgICAgZm9yIChzaXplX3Qg
c2NyZWVuSW5kZXggPSAwOyBzY3JlZW5JbmRleCA8IG1fcnVucy5zaXplKCk7IHNjcmVlbkluZGV4
KyspIHsKKyAgICAgICAgaW50IGl0ZW1JbmRleCA9IG1fc2NyZWVuT3JkZXJbc2NyZWVuSW5kZXhd
OworICAgICAgICBjb25zdCBTQ1JJUFRfSVRFTSYgaXRlbSA9IG1fcnVuc1tpdGVtSW5kZXhdOwor
ICAgICAgICBjb25zdCBTaGFwaW5nJiBzaGFwaW5nID0gbV9zaGFwZXNbaXRlbUluZGV4XTsKKwor
ICAgICAgICAvLyBDaGFyYWN0ZXIgb2Zmc2V0cyB3aXRoaW4gdGhpcyBydW4uIFRIRVNFIE1BWSBO
T1QgQkUgSU4gUkFOR0UgYW5kIG1heQorICAgICAgICAvLyBiZSBuZWdhdGl2ZSwgZXRjLiBUaGUg
Y29kZSBiZWxvdyBoYW5kbGVzIHRoaXMuCisgICAgICAgIGludCBmcm9tQ2hhciA9IGZyb20gLSBp
dGVtLmlDaGFyUG9zOworICAgICAgICBpbnQgdG9DaGFyID0gdG8gLSBpdGVtLmlDaGFyUG9zOwor
CisgICAgICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIGRyYXcgYW55IGNoYXJhY3RlcnMgaW4gdGhp
cyBpdGVtLgorICAgICAgICBpZiAoc2hhcGluZy5jaGFyTGVuZ3RoKCkgPT0gMCB8fAorICAgICAg
ICAgICAgZnJvbUNoYXIgPj0gc2hhcGluZy5jaGFyTGVuZ3RoKCkgfHwgdG9DaGFyIDw9IDApIHsK
KyAgICAgICAgICAgIC8vIE5vIGNoYXJzIGluIHRoaXMgaXRlbSB0byBkaXNwbGF5LgorICAgICAg
ICAgICAgY3VyWCArPSBhZHZhbmNlRm9ySXRlbShpdGVtSW5kZXgpOworICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIHRoZSBzdGFydGluZyBnbHlw
aCB3aXRoaW4gdGhpcyBzcGFuLiB8ZnJvbXwgYW5kIHx0b3wgYXJlCisgICAgICAgIC8vIGdsb2Jh
bCBvZmZzZXRzIHRoYXQgbWF5IGludGVyc2VjdCBhcmJpdHJhcmlseSB3aXRoIG91ciBsb2NhbCBy
dW4uCisgICAgICAgIGludCBmcm9tR2x5cGgsIGFmdGVyR2x5cGg7CisgICAgICAgIGlmIChpdGVt
LmEuZlJUTCkgeworICAgICAgICAgICAgLy8gVG8gY29tcHV0ZSB0aGUgZmlyc3QgZ2x5cGggd2hl
biBnb2luZyBSVEwsIHdlIHVzZSB8dG98LgorICAgICAgICAgICAgaWYgKHRvQ2hhciA+PSBzaGFw
aW5nLmNoYXJMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW5kIG9mIHRoZSB0ZXh0
IGlzIGFmdGVyICh0byB0aGUgbGVmdCkgb2YgdXMuCisgICAgICAgICAgICAgICAgZnJvbUdseXBo
ID0gMDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIHx0b3wg
aXMgZXhjbHVzaXZlLCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdlIGRyYXcgb24gdGhlCisgICAgICAg
ICAgICAgICAgLy8gbGVmdCBpcyBhY3R1YWxseSB0aGUgb25lIHJpZ2h0IGJlZm9yZSAodG8gdGhl
IHJpZ2h0KSBvZgorICAgICAgICAgICAgICAgIC8vIHx0b3wuCisgICAgICAgICAgICAgICAgZnJv
bUdseXBoID0gc2hhcGluZy5tX2xvZ3NbdG9DaGFyIC0gMV07CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIC8vIFRoZSBsYXN0IGdseXBoIGlzIGFjdHVhbGx5IHRoZSBmaXJzdCBjaGFyYWN0
ZXIgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKGZyb21DaGFyIDw9IDApIHsKKyAgICAg
ICAgICAgICAgICAvLyBUaGUgZmlyc3QgY2hhcmFjdGVyIHRvIGRyYXcgaXMgYmVmb3JlICh0byB0
aGUgcmlnaHQpIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBzcGFuLCBzbyBkcmF3IGFsbCB0
aGUgd2F5IHRvIHRoZSBlbmQuCisgICAgICAgICAgICAgICAgYWZ0ZXJHbHlwaCA9IHNoYXBpbmcu
Z2x5cGhMZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8g
V2Ugd2FudCB0byBkcmF3IGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIGNoYXJhY3RlciB0byB0aGUK
KyAgICAgICAgICAgICAgICAvLyByaWdodCBvZiB8ZnJvbXwuIFRvIHRoZSByaWdodCBpcyAtIDEs
IHNvIHdlIGxvb2sgdGhhdCB1cAorICAgICAgICAgICAgICAgIC8vIChyZW1lbWJlciBvdXIgY2hh
cmFjdGVyIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgZ2x5cGgsIHNvIHdlCisgICAgICAgICAgICAg
ICAgLy8gY2FuJ3QgbG9vayB1cCBvdXIgZ2x5cGggYW5kIGFkZCBvbmUpLgorICAgICAgICAgICAg
ICAgIGFmdGVyR2x5cGggPSBzaGFwaW5nLm1fbG9nc1tmcm9tQ2hhciAtIDFdOworICAgICAgICAg
ICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRWFzeSBjYXNlLCBldmVyeWJv
ZHkgYWdyZWVzIGFib3V0IGRpcmVjdGlvbnMuIFdlIG9ubHkgbmVlZCB0bworICAgICAgICAgICAg
Ly8gaGFuZGxlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgdG8gZ2V0IGEgcmFuZ2UgaW5jbHVzaXZlIGF0
IHRoZQorICAgICAgICAgICAgLy8gYmVnaW5uaW5nLCBhbmQgZXhjbHVzaXZlIGF0IHRoZSBlbmRp
bmcuIFdlIGhhdmUgdG8gZG8gc29tZQorICAgICAgICAgICAgLy8gY29tcHV0YXRpb24gdG8gc2Vl
IHRoZSBnbHlwaCBvbmUgcGFzdCB0aGUgZW5kLgorICAgICAgICAgICAgZnJvbUdseXBoID0gc2hh
cGluZy5tX2xvZ3NbZnJvbUNoYXIgPCAwID8gMCA6IGZyb21DaGFyXTsKKyAgICAgICAgICAgIGlm
ICh0b0NoYXIgPj0gc2hhcGluZy5jaGFyTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgYWZ0ZXJH
bHlwaCA9IHNoYXBpbmcuZ2x5cGhMZW5ndGgoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBhZnRlckdseXBoID0gc2hhcGluZy5tX2xvZ3NbdG9DaGFyXTsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIEFjY291bnQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBza2lwcGVk
IGluIHRoaXMgcnVuLiBXaGVuCisgICAgICAgIC8vIFdlYktpdCBhc2tzIHVzIHRvIGRyYXcgYSBz
dWJzZXQgb2YgdGhlIHJ1biwgaXQgYWN0dWFsbHkgdGVsbHMgdXMKKyAgICAgICAgLy8gdG8gZHJh
dyBhdCB0aGUgWCBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuLCBzaW5jZSBpdAor
ICAgICAgICAvLyBkb2Vzbid0IGtub3cgdGhlIGludGVybmFsIHBvc2l0aW9uIG9mIGFueSBvZiBv
dXIgY2hhcmFjdGVycy4KKyAgICAgICAgY29uc3QgaW50KiBlZmZlY3RpdmVBZHZhbmNlcyA9IHNo
YXBpbmcuZWZmZWN0aXZlQWR2YW5jZXMoKTsKKyAgICAgICAgaW50IGlubmVyT2Zmc2V0ID0gMDsK
KyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tR2x5cGg7IGkrKykKKyAgICAgICAgICAg
IGlubmVyT2Zmc2V0ICs9IGVmZmVjdGl2ZUFkdmFuY2VzW2ldOworCisgICAgICAgIC8vIEFjdHVh
bGx5IGRyYXcgdGhlIGdseXBocyB3ZSBmb3VuZC4KKyAgICAgICAgaW50IGdseXBoQ291bnQgPSBh
ZnRlckdseXBoIC0gZnJvbUdseXBoOworICAgICAgICBpZiAoZnJvbUdseXBoID49IDAgJiYgZ2x5
cGhDb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIHRoZSBwcmVjZWVkaW5n
IHNwYWNlIHdlIG5lZWQgdG8gYWRkIHRvIHRoaXMgcnVuLiBXZQorICAgICAgICAgICAgLy8gZG9u
J3QgbmVlZCB0byBjb3VudCBmb3IgdGhlIGZvbGxvd2luZyBzcGFjZSBiZWNhdXNlIHRoYXQgd2ls
bCBiZQorICAgICAgICAgICAgLy8gY291bnRlZCBpbiBhZHZhbmNlRm9ySXRlbSBiZWxvdyB3aGVu
IHdlIG1vdmUgdG8gdGhlIG5leHQgcnVuLgorICAgICAgICAgICAgaW5uZXJPZmZzZXQgKz0gc2hh
cGluZy5tX3ByZVBhZGRpbmc7CisKKyAgICAgICAgICAgIC8vIFBhc3MgMCBpbiB3aGVuIHRoZXJl
IGlzIG5vIGp1c3RpZmljYXRpb24uCisgICAgICAgICAgICBjb25zdCBpbnQqIGp1c3RpZnkgPSBz
aGFwaW5nLm1fanVzdGlmeS5zaXplKCkgPT0gMCA/IDAgOiAmc2hhcGluZy5tX2p1c3RpZnlbZnJv
bUdseXBoXTsKKworICAgICAgICAgICAgaWYgKGZpcnN0UnVuKSB7CisgICAgICAgICAgICAgICAg
b2xkRm9udCA9IFNlbGVjdE9iamVjdChkYywgc2hhcGluZy5tX2hmb250KTsKKyAgICAgICAgICAg
ICAgICBmaXJzdFJ1biA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAg
ICAgU2VsZWN0T2JqZWN0KGRjLCBzaGFwaW5nLm1faGZvbnQpOworCisgICAgICAgICAgICAvLyBG
b250cyB3aXRoIGRpZmZlcmVudCBhc2NlbnRzIGNhbiBiZSB1c2VkIHRvIHJlbmRlciBkaWZmZXJl
bnQKKyAgICAgICAgICAgIC8vIHJ1bnMuICAnQWNyb3NzLXJ1bnMnIHktY29vcmRpbmF0ZSBjb3Jy
ZWN0aW9uIG5lZWRzIHRvIGJlCisgICAgICAgICAgICAvLyBhZGp1c3RlZCBmb3IgZWFjaCBmb250
LgorICAgICAgICAgICAgSFJFU1VMVCBociA9IFNfRkFMU0U7CisgICAgICAgICAgICBmb3IgKGlu
dCBleGVjdXRpb25zID0gMDsgZXhlY3V0aW9ucyA8IDI7ICsrZXhlY3V0aW9ucykgeworICAgICAg
ICAgICAgICAgIGhyID0gU2NyaXB0VGV4dE91dChkYywgc2hhcGluZy5tX3NjcmlwdENhY2hlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJYICsgaW5uZXJPZmZzZXQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSBzaGFwaW5nLm1fYXNjZW50T2Zm
c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAmaXRlbS5hLCAw
LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcGluZy5tX2dseXBo
c1tmcm9tR2x5cGhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaENv
dW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcGluZy5tX2FkdmFu
Y2VbZnJvbUdseXBoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlm
eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXBpbmcubV9vZmZzZXRz
W2Zyb21HbHlwaF0pOworICAgICAgICAgICAgICAgIGlmIChTX09LICE9IGhyICYmIDAgPT0gZXhl
Y3V0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIFNjcmlwdFRleHRPdXQg
aXMgY2FsbGVkIGZyb20gdGhlIHJlbmRlcmVyIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIG1p
Z2h0IGZhaWwgYmVjYXVzZSB0aGUgc2FuZGJveCBpcyBwcmV2ZW50aW5nIGl0IGZyb20KKyAgICAg
ICAgICAgICAgICAgICAgLy8gb3BlbmluZyB0aGUgZm9udCBmaWxlcy4gIElmIHdlIGFyZSBydW5u
aW5nIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJlciwgVHJ5VG9QcmVsb2Fk
Rm9udCBpcyBvdmVycmlkZGVuIHRvIGFzayB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnJv
d3NlciB0byBwcmVsb2FkIHRoZSBmb250IGZvciB1cyBzbyB3ZSBjYW4gYWNjZXNzIGl0LgorICAg
ICAgICAgICAgICAgICAgICB0cnlUb1ByZWxvYWRGb250KHNoYXBpbmcubV9oZm9udCk7CisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVNTRVJUKFNfT0sgPT0g
aHIpOworICAgICAgICB9CisKKyAgICAgICAgY3VyWCArPSBhZHZhbmNlRm9ySXRlbShpdGVtSW5k
ZXgpOworICAgIH0KKworICAgIGlmIChvbGRGb250KQorICAgICAgICBTZWxlY3RPYmplY3QoZGMs
IG9sZEZvbnQpOworfQorCitXT1JEIFVuaXNjcmliZUhlbHBlcjo6Zmlyc3RHbHlwaEZvckNoYXJh
Y3RlcihpbnQgY2hhck9mZnNldCkgY29uc3QKK3sKKyAgICAvLyBGaW5kIHRoZSBydW4gZm9yIHRo
ZSBnaXZlbiBjaGFyYWN0ZXIuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxp
bnQ+KG1fcnVucy5zaXplKCkpOyBpKyspIHsKKyAgICAgICAgaW50IGZpcnN0Q2hhciA9IG1fcnVu
c1tpXS5pQ2hhclBvczsKKyAgICAgICAgY29uc3QgU2hhcGluZyYgc2hhcGluZyA9IG1fc2hhcGVz
W2ldOworICAgICAgICBpbnQgbG9jYWxPZmZzZXQgPSBjaGFyT2Zmc2V0IC0gZmlyc3RDaGFyOwor
ICAgICAgICBpZiAobG9jYWxPZmZzZXQgPj0gMCAmJiBsb2NhbE9mZnNldCA8IHNoYXBpbmcuY2hh
ckxlbmd0aCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGlzIGluIHRoaXMgcnVu
LCByZXR1cm4gdGhlIGZpcnN0IGdseXBoIGZvciBpdAorICAgICAgICAgICAgLy8gKHNob3VsZCBn
ZW5lcmFsbHkgYmUgdGhlIG9ubHkgZ2x5cGgpLiBJdCBzZWVtcyBVbmlzY3JpYmUgZ2l2ZXMKKyAg
ICAgICAgICAgIC8vIGdseXBoIDAgZm9yIGVtcHR5LCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8g
cmV0dXJuIGluIHRoZQorICAgICAgICAgICAgLy8gIm1pc3NpbmciIGNhc2UuCisgICAgICAgICAg
ICBzaXplX3QgZ2x5cGhJbmRleCA9IHNoYXBpbmcubV9sb2dzW2xvY2FsT2Zmc2V0XTsKKyAgICAg
ICAgICAgIGlmIChnbHlwaEluZGV4ID49IHNoYXBpbmcubV9nbHlwaHMuc2l6ZSgpKSB7CisgICAg
ICAgICAgICAgICAgLy8gVGhlIGdseXBoIHNob3VsZCBiZSBpbiB0aGlzIHJ1biwgYnV0IHRoZSBy
dW4gaGFzIHRvbyBmZXcKKyAgICAgICAgICAgICAgICAvLyBhY3R1YWwgY2hhcmFjdGVycy4gVGhp
cyBjYW4gaGFwcGVuIHdoZW4gc2hhcGluZyB0aGUgcnVuCisgICAgICAgICAgICAgICAgLy8gZmFp
bHMsIGluIHdoaWNoIGNhc2UsIHdlIHNob3VsZCBoYXZlIG5vIGRhdGEgaW4gdGhlIGxvZ3MgYXQK
KyAgICAgICAgICAgICAgICAvLyBhbGwuCisgICAgICAgICAgICAgICAgQVNTRVJUKHNoYXBpbmcu
bV9nbHlwaHMuc2l6ZSgpID09IDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNoYXBpbmcubV9nbHlwaHNbZ2x5cGhJbmRleF07
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBVbmlzY3JpYmVI
ZWxwZXI6OmZpbGxSdW5zKCkKK3sKKyAgICBIUkVTVUxUIGhyOworICAgIG1fcnVucy5yZXNpemUo
VU5JU0NSSUJFX0hFTFBFUl9TVEFDS19SVU5TKTsKKworICAgIFNDUklQVF9TVEFURSBpbnB1dFN0
YXRlOworICAgIGlucHV0U3RhdGUudUJpZGlMZXZlbCA9IG1faXNSdGw7CisgICAgaW5wdXRTdGF0
ZS5mT3ZlcnJpZGVEaXJlY3Rpb24gPSBtX2RpcmVjdGlvbmFsT3ZlcnJpZGU7CisgICAgaW5wdXRT
dGF0ZS5mSW5oaWJpdFN5bVN3YXAgPSBmYWxzZTsKKyAgICBpbnB1dFN0YXRlLmZDaGFyU2hhcGUg
PSBmYWxzZTsgIC8vIE5vdCBpbXBsZW1lbnRlZCBpbiBVbmlzY3JpYmUKKyAgICBpbnB1dFN0YXRl
LmZEaWdpdFN1YnN0aXR1dGUgPSBmYWxzZTsgIC8vIERvIHdlIHdhbnQgdGhpcyBmb3IgQXJhYmlj
PworICAgIGlucHV0U3RhdGUuZkluaGliaXRMaWdhdGUgPSBtX2luaGliaXRMaWdhdGU7CisgICAg
aW5wdXRTdGF0ZS5mRGlzcGxheVpXRyA9IGZhbHNlOyAgLy8gRG9uJ3QgZHJhdyBjb250cm9sIGNo
YXJhY3RlcnMuCisgICAgaW5wdXRTdGF0ZS5mQXJhYmljTnVtQ29udGV4dCA9IG1faXNSdGw7ICAv
LyBEbyB3ZSB3YW50IHRoaXMgZm9yIEFyYWJpYz8KKyAgICBpbnB1dFN0YXRlLmZHY3BDbHVzdGVy
cyA9IGZhbHNlOworICAgIGlucHV0U3RhdGUuZlJlc2VydmVkID0gMDsKKyAgICBpbnB1dFN0YXRl
LmZFbmdpbmVSZXNlcnZlZCA9IDA7CisgICAgLy8gVGhlIHBzQ29udHJvbCBhcmd1bWVudCB0byBT
Y3JpcHRJdGVtaXplIHNob3VsZCBiZSBub24tMCBmb3IgUlRMIHRleHQsCisgICAgLy8gcGVyIGh0
dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczc3NjUzMi5hc3B4IC4gU28g
dXNlIGEKKyAgICAvLyBTQ1JJUFRfQ09OVFJPTCB0aGF0IGlzIHNldCB0byBhbGwgemVyb3MuICBa
ZXJvIGFzIGEgbG9jYWxlIElEIG1lYW5zIHRoZQorICAgIC8vIG5ldXRyYWwgbG9jYWxlIHBlciBo
dHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM3NzYyOTQuYXNweAorICAg
IHN0YXRpYyBTQ1JJUFRfQ09OVFJPTCBpbnB1dENvbnRyb2wgPSB7MCwgLy8gdURlZmF1bHRMYW5n
dWFnZSAgICA6MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
MCwgLy8gZkNvbnRleHREaWdpdHMgICAgICA6MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAwLCAvLyBmSW52ZXJ0UHJlQm91bmREaXIgIDoxOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIGZJbnZlcnRQb3N0Qm91bmRE
aXIgOjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8g
ZkxpbmtTdHJpbmdCZWZvcmUgICA6MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAwLCAvLyBmTGlua1N0cmluZ0FmdGVyICAgIDoxOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIGZOZXV0cmFsT3ZlcnJpZGUgICAgOjE7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gZk51bWVy
aWNPdmVycmlkZSAgICA6MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAwLCAvLyBmTGVnYWN5QmlkaUNsYXNzICAgIDoxOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIGZNZXJnZU5ldXRyYWxJdGVtcyAgOjE7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ly8gZlJlc2VydmVkICAg
ICAgICAgICA6NzsKKyAgICAvLyBDYWxsaW5nIFNjcmlwdEFwcGx5RGlnaXRTdWJzdGl0dXRpb24o
IDAsICZpbnB1dENvbnRyb2wsICZpbnB1dFN0YXRlKQorICAgIC8vIGhlcmUgd291bGQgYmUgYXBw
cm9wcmlhdGUgaWYgd2Ugd2FudGVkIHRvIHNldCB0aGUgbGFuZ3VhZ2UgSUQsIGFuZCBnZXQKKyAg
ICAvLyBsb2NhbCBkaWdpdCBzdWJzdGl0dXRpb24gYmVoYXZpb3IuICBGb3Igbm93LCBkb24ndCBk
byBpdC4KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBudW1faXRlbXMgPSAwOwor
CisgICAgICAgIC8vIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgYSB3YXkgdG8ga25vdyB0aGUgcnVu
cyBiZWZvcmUgYW5kIGFmdGVyIHRoaXMKKyAgICAgICAgLy8gb25lLCBhbmQgcHV0IHRoZW0gaW50
byB0aGUgY29udHJvbCBwYXJhbWV0ZXIgb2YgU2NyaXB0SXRlbWl6ZS4gVGhpcworICAgICAgICAv
LyB3b3VsZCBhbGxvdyB1cyB0byBzaGFwZSBjaGFyYWN0ZXJzIHByb3Blcmx5IHRoYXQgY3Jvc3Mg
c3R5bGUKKyAgICAgICAgLy8gYm91bmRhcmllcyAoV2ViS2l0IGJ1ZyA2MTQ4KS4KKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gV2UgdGVsbCBTY3JpcHRJdGVtaXplIHRoYXQgdGhlIG91dHB1dCBsaXN0
IG9mIGl0ZW1zIGlzIG9uZSBzbWFsbGVyCisgICAgICAgIC8vIHRoYW4gaXQgYWN0dWFsbHkgaXMu
IEFjY29yZGluZyB0byBNb3ppbGxhIGJ1ZyAzNjY2NDMsIGlmIHRoZXJlIGlzCisgICAgICAgIC8v
IG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYXJyYXkgb24gcHJlLVNQMiBzeXN0ZW1zLCBTY3JpcHRJ
dGVtaXplIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVm
ZmVyLgorICAgICAgICAvLworICAgICAgICAvLyBTY3JpcHRJdGVtaXplIGlzIHZlcnkgc3RyYW5n
ZS4gSXQgd2lsbCBvZnRlbiByZXF1aXJlIGEgbXVjaCBsYXJnZXIKKyAgICAgICAgLy8gSVRFTSBi
dWZmZXIgaW50ZXJuYWxseSB0aGFuIGl0IHdpbGwgZ2l2ZSB1cyBhcyBvdXRwdXQuIEZvciBleGFt
cGxlLAorICAgICAgICAvLyBpdCB3aWxsIHNheSBhIDE2LWl0ZW0gYnVmZmVyIGlzIG5vdCBiaWcg
ZW5vdWdoLCBhbmQgd2lsbCB3cml0ZQorICAgICAgICAvLyBpbnRlcmVzdGluZyBudW1iZXJzIGlu
dG8gYWxsIHRob3NlIGl0ZW1zLiBCdXQgd2hlbiB3ZSBnaXZlIGl0IGEgMzIKKyAgICAgICAgLy8g
aXRlbSBidWZmZXIgYW5kIGl0IHN1Y2NlZWRzLCBpdCBvbmx5IGhhcyBvbmUgaXRlbSBvdXRwdXQu
CisgICAgICAgIC8vCisgICAgICAgIC8vIEl0IHNlZW1zIHRvIGJlIGRvaW5nIGF0IGxlYXN0IHR3
byBwYXNzZXMsIHRoZSBmaXJzdCB3aGVyZSBpdCBwdXRzIGEKKyAgICAgICAgLy8gbG90IG9mIGlu
dGVybWVkaWF0ZSBkYXRhIGludG8gb3VyIGl0ZW1zLCBhbmQgdGhlIHNlY29uZCB3aGVyZSBpdAor
ICAgICAgICAvLyBjb2xsYXRlcyB0aGVtLgorICAgICAgICBociA9IFNjcmlwdEl0ZW1pemUobV9p
bnB1dCwgbV9pbnB1dExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PGludD4obV9ydW5zLnNpemUoKSkgLSAxLCAmaW5wdXRDb250cm9sLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJmlucHV0U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAm
bV9ydW5zWzBdLCAmbnVtX2l0ZW1zKTsKKyAgICAgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAg
ICAgICAgICAgIG1fcnVucy5yZXNpemUobnVtX2l0ZW1zKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGlmIChociAhPSBFX09VVE9GTUVNT1JZKSB7CisgICAgICAgICAg
ICAvLyBTb21lIGtpbmQgb2YgdW5leHBlY3RlZCBlcnJvci4KKyAgICAgICAgICAgIG1fcnVucy5y
ZXNpemUoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGVy
ZSB3YXMgbm90IGVub3VnaCBpdGVtcyBmb3IgaXQgdG8gd3JpdGUgaW50bywgZXhwYW5kLgorICAg
ICAgICBtX3J1bnMucmVzaXplKG1fcnVucy5zaXplKCkgKiAyKTsKKyAgICB9Cit9CisKK2Jvb2wg
VW5pc2NyaWJlSGVscGVyOjpzaGFwZShjb25zdCBVQ2hhciogaW5wdXQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaW50IGl0ZW1MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW50IG51bUdseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1JJUFRfSVRF
TSYgcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXBpbmcmIHNoYXBpbmcpCit7
CisgICAgSEZPTlQgaGZvbnQgPSBtX2hmb250OworICAgIFNDUklQVF9DQUNIRSogc2NyaXB0Q2Fj
aGUgPSBtX3NjcmlwdENhY2hlOworICAgIFNDUklQVF9GT05UUFJPUEVSVElFUyogZm9udFByb3Bl
cnRpZXMgPSBtX2ZvbnRQcm9wZXJ0aWVzOworICAgIGludCBhc2NlbnQgPSBtX2FzY2VudDsKKyAg
ICBIREMgdGVtcERDID0gMDsKKyAgICBIR0RJT0JKIG9sZEZvbnQgPSAwOworICAgIEhSRVNVTFQg
aHI7CisgICAgYm9vbCBsYXN0RmFsbGJhY2tUcmllZCA9IGZhbHNlOworICAgIGJvb2wgcmVzdWx0
OworCisgICAgaW50IGdlbmVyYXRlZEdseXBocyA9IDA7CisKKyAgICAvLyBJbiBjYXNlIEhGT05U
IHBhc3NlZCBpbiBjdG9yIGNhbm5vdCByZW5kZXIgdGhpcyBydW4sIHdlIGhhdmUgdG8gc2Nhbgor
ICAgIC8vIG90aGVyIGZvbnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9udCBsaXN0Lgor
ICAgIHJlc2V0Rm9udEluZGV4KCk7CisKKyAgICAvLyBDb21wdXRlIHNoYXBlcy4KKyAgICB3aGls
ZSAodHJ1ZSkgeworICAgICAgICBzaGFwaW5nLm1fbG9ncy5yZXNpemUoaXRlbUxlbmd0aCk7Cisg
ICAgICAgIHNoYXBpbmcubV9nbHlwaHMucmVzaXplKG51bUdseXBocyk7CisgICAgICAgIHNoYXBp
bmcubV92aXN1YWxBdHRyaWJ1dGVzLnJlc2l6ZShudW1HbHlwaHMpOworCisjaWZkZWYgUFVSSUZZ
CisgICAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0
YWlsP2lkPTUzMDkKKyAgICAgICAgLy8gUHVyaWZ5IGlzbid0IGFibGUgdG8gdHJhY2sgdGhlIGFz
c2lnbm1lbnRzIHRoYXQgU2NyaXB0U2hhcGUgbWFrZXMgdG8KKyAgICAgICAgLy8gc2hhcGluZy5t
X2dseXBocy4gQ29uc2VxdWVudGx5LCBhbnkgYnl0ZXMgd2l0aCB2YWx1ZSAweENEIHRoYXQgaXQK
KyAgICAgICAgLy8gd3JpdGVzLCB3aWxsIGJlIGNvbnNpZGVyZWQgdW4taW5pdGlhbGl6ZWQgZGF0
YS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBoYWNrIGF2b2lkIHRoZSBmYWxzZS1wb3Np
dGl2ZSBVTVJzIGJ5IG1hcmtpbmcgdGhlIGJ1ZmZlciBhcworICAgICAgICAvLyBpbml0aWFsaXpl
ZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IEEgYmV0dGVyIHNvbHV0aW9uIHdvdWxk
IGJlIHRvIHVzZSBQdXJpZnkncyBBUEkgYW5kIG1hcmsgb25seQorICAgICAgICAvLyB0aGUgcG9w
dWxhdGVkIHJhbmdlIGFzIGluaXRpYWxpemVkOgorICAgICAgICAvLworICAgICAgICAvLyAgICAg
UHVyaWZ5TWFya0FzSW5pdGlhbGl6ZWQoCisgICAgICAgIC8vICAgICAgICAgJnNoYXBpbmcubV9n
bHlwaHNbMF0sCisgICAgICAgIC8vICAgICAgICAgc2l6ZW9mKHNoYXBpbmcubV9nbHlwaHNbMF0g
KiBnZW5lcmF0ZWRHbHlwaHMpOworICAgICAgICAKKyAgICAgICAgWmVyb01lbW9yeSgmc2hhcGlu
Zy5tX2dseXBoc1swXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2hhcGluZy5tX2dseXBo
c1swXSkgKiBzaGFwaW5nLm1fZ2x5cGhzLnNpemUoKSk7CisjZW5kaWYKKworICAgICAgICAvLyBG
aXJlZm94IHNldHMgU0NSSVBUX0FOQUxZU0lTLlNDUklQVF9TVEFURS5mRGlzcGxheVpXRyB0byB0
cnVlCisgICAgICAgIC8vIGhlcmUuIElzIHRoYXQgd2hhdCB3ZSB3YW50PyBJdCB3aWxsIGRpc3Bs
YXkgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICBociA9IFNjcmlwdFNoYXBlKHRlbXBEQywg
c2NyaXB0Q2FjaGUsIGlucHV0LCBpdGVtTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAg
IG51bUdseXBocywgJnJ1bi5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFwaW5nLm1f
Z2x5cGhzWzBdLCAmc2hhcGluZy5tX2xvZ3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAg
JnNoYXBpbmcubV92aXN1YWxBdHRyaWJ1dGVzWzBdLCAmZ2VuZXJhdGVkR2x5cGhzKTsKKyAgICAg
ICAgaWYgKGhyID09IEVfUEVORElORykgeworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIERD
LgorICAgICAgICAgICAgdGVtcERDID0gR2V0REMoMCk7CisgICAgICAgICAgICBvbGRGb250ID0g
U2VsZWN0T2JqZWN0KHRlbXBEQywgaGZvbnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIH0gZWxzZSBpZiAoaHIgPT0gRV9PVVRPRk1FTU9SWSkgeworICAgICAgICAgICAgbnVtR2x5
cGhzICo9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChTVUND
RUVERUQoaHIpICYmIChsYXN0RmFsbGJhY2tUcmllZCB8fCAhY29udGFpbnNNaXNzaW5nR2x5cGhz
KCZzaGFwaW5nLm1fZ2x5cGhzWzBdLCBnZW5lcmF0ZWRHbHlwaHMsIGZvbnRQcm9wZXJ0aWVzKSkp
CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBUaGUgY3VycmVudCBmb250IGNhbid0
IHJlbmRlciB0aGlzIHJ1bi4gY2xlYXIgREMgYW5kIHRyeQorICAgICAgICAvLyBuZXh0IGZvbnQu
CisgICAgICAgIGlmICh0ZW1wREMpIHsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdCh0ZW1wREMs
IG9sZEZvbnQpOworICAgICAgICAgICAgUmVsZWFzZURDKDAsIHRlbXBEQyk7CisgICAgICAgICAg
ICB0ZW1wREMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5leHRXaW5Gb250RGF0YSgm
aGZvbnQsICZzY3JpcHRDYWNoZSwgJmZvbnRQcm9wZXJ0aWVzLCAmYXNjZW50KSkgeworICAgICAg
ICAgICAgLy8gVGhlIHByaW1hcnkgZm9udCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcnVuLiBUcnkg
bmV4dCBmb250LgorICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB3ZWIgcGFnZSByZW5kZXJpbmcs
IHRoZXkgY29tZSBmcm9tIGZvbnRzIHNwZWNpZmllZCBpbgorICAgICAgICAgICAgLy8gQ1NTIHN0
eWxlc2hlZXRzLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWxh
c3RGYWxsYmFja1RyaWVkKSB7CisgICAgICAgICAgICBsYXN0RmFsbGJhY2tUcmllZCA9IHRydWU7
CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgbGFzdCBmYWxsYmFjayBmb250IGJhc2VkIG9u
IHRoZSBzY3JpcHQgb2YKKyAgICAgICAgICAgIC8vIGEgY2hhcmFjdGVyIHRvIGRyYXcgd2hpbGUg
aW5oZXJpdGluZyBzaXplIGFuZCBzdHlsZXMKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHByaW1h
cnkgZm9udAorICAgICAgICAgICAgaWYgKCFtX2xvZ2ZvbnQubGZGYWNlTmFtZVswXSkKKyAgICAg
ICAgICAgICAgICBzZXRMb2dGb250QW5kU3R5bGUobV9oZm9udCwgJm1fbG9nZm9udCwgJm1fc3R5
bGUpOworCisgICAgICAgICAgICAvLyBUT0RPKGp1bmdzaGlrKTogZ2VuZXJpYyB0eXBlIHNob3Vs
ZCBjb21lIGZyb20gd2Via2l0IGZvcgorICAgICAgICAgICAgLy8gVW5pc2NyaWJlSGVscGVyVGV4
dFJ1biAoYSBkZXJpdmVkIGNsYXNzIHVzZWQgaW4gd2Via2l0KS4KKyAgICAgICAgICAgIGNvbnN0
IFVDaGFyICpmYW1pbHkgPSBnZXRGYWxsYmFja0ZhbWlseShpbnB1dCwgaXRlbUxlbmd0aCwKKyAg
ICAgICAgICAgICAgICBGb250RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5LCAwLCAwKTsKKyAg
ICAgICAgICAgIGJvb2wgZm9udE9rID0gZ2V0RGVyaXZlZEZvbnREYXRhKGZhbWlseSwgbV9zdHls
ZSwgJm1fbG9nZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAmYXNjZW50LCAmaGZvbnQsICZzY3JpcHRDYWNoZSk7CisKKyAgICAgICAgICAgIGlmICgh
Zm9udE9rKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBHZXREZXJpdmVkRm9udERhdGEg
aXMgY2FsbGVkIGZyb20gdGhlIHJlbmRlcmVyIGl0CisgICAgICAgICAgICAgICAgLy8gbWlnaHQg
ZmFpbCBiZWNhdXNlIHRoZSBzYW5kYm94IGlzIHByZXZlbnRpbmcgaXQgZnJvbSBvcGVuaW5nCisg
ICAgICAgICAgICAgICAgLy8gdGhlIGZvbnQgZmlsZXMuICBJZiB3ZSBhcmUgcnVubmluZyBpbiB0
aGUgcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgLy8gVHJ5VG9QcmVsb2FkRm9udCBpcyBvdmVy
cmlkZGVuIHRvIGFzayB0aGUgYnJvd3NlciB0byBwcmVsb2FkCisgICAgICAgICAgICAgICAgLy8g
dGhlIGZvbnQgZm9yIHVzIHNvIHdlIGNhbiBhY2Nlc3MgaXQuCisgICAgICAgICAgICAgICAgdHJ5
VG9QcmVsb2FkRm9udChoZm9udCk7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4uCisg
ICAgICAgICAgICAgICAgZm9udE9rID0gZ2V0RGVyaXZlZEZvbnREYXRhKGZhbWlseSwgbV9zdHls
ZSwgJm1fbG9nZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZhc2NlbnQsICZoZm9udCwgJnNjcmlwdENhY2hlKTsKKyAgICAgICAgICAgICAgICBBU1NF
UlQoZm9udE9rKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETyhqdW5nc2hp
aykgOiBDdXJyZW50bHkgR2V0RGVyaXZlZEhGb250IGFsd2F5cyByZXR1cm5zIGEKKyAgICAgICAg
ICAgIC8vIGEgdmFsaWQgSEZPTlQsIGJ1dCBpbiB0aGUgZnV0dXJlLCBJIG1heSBjaGFuZ2UgaXQg
dG8gcmV0dXJuIDAuCisgICAgICAgICAgICBBU1NFUlQoaGZvbnQpOworCisgICAgICAgICAgICAv
LyBXZSBkb24ndCBuZWVkIGEgZm9udF9wcm9wZXJ0aWVzIGZvciB0aGUgbGFzdCByZXNvcnQgZmFs
bGJhY2sgZm9udAorICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5n
IG1vcmUgdG8gdHJ5IGFuZCBhcmUgZm9yY2VkIHRvCisgICAgICAgICAgICAvLyBhY2NlcHQgZW1w
dHkgZ2x5cGggYm94ZXMuIElmIHdlIHRyaWVkIGEgc2VyaWVzIG9mIGZvbnRzIGFzCisgICAgICAg
ICAgICAvLyAnbGFzdC1yZXNvcnQgZmFsbGJhY2snLCB3ZSdkIG5lZWQgaXQsIGJ1dCBjdXJyZW50
bHksIHdlIGRvbid0LgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAo
aHIgPT0gVVNQX0VfU0NSSVBUX05PVF9JTl9GT05UKSB7CisgICAgICAgICAgICBydW4uYS5lU2Ny
aXB0ID0gU0NSSVBUX1VOREVGSU5FRDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9
IGVsc2UgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIC8vIEVycm9yIHNoYXBpbmcuCisg
ICAgICAgICAgICBnZW5lcmF0ZWRHbHlwaHMgPSAwOworICAgICAgICAgICAgcmVzdWx0ID0gZmFs
c2U7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBTZXRzIFdpbmRvd3MgZm9udCBkYXRhIGZvciB0aGlzIHJ1biB0byB0aG9zZSBjb3JyZXNwb25k
aW5nIHRvCisgICAgLy8gYSBmb250IHN1cHBvcnRpbmcgdGhpcyBydW4uIHdlIGRvbid0IG5lZWQg
dG8gc3RvcmUgZm9udF9wcm9wZXJ0aWVzCisgICAgLy8gYmVjYXVzZSBpdCdzIG5vdCB1c2VkIGVs
c2V3aGVyZS4KKyAgICBzaGFwaW5nLm1faGZvbnQgPSBoZm9udDsKKyAgICBzaGFwaW5nLm1fc2Ny
aXB0Q2FjaGUgPSBzY3JpcHRDYWNoZTsKKworICAgIC8vIFRoZSBhc2NlbnQgb2YgYSBmb250IGZv
ciB0aGlzIHJ1biBjYW4gYmUgZGlmZmVyZW50IGZyb20KKyAgICAvLyB0aGF0IG9mIHRoZSBwcmlt
YXJ5IGZvbnQgc28gdGhhdCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAvLyB0aGUgZGlm
ZmVyZW5jZSBwZXIgcnVuIGFuZCB0YWtlIHRoYXQgaW50byBhY2NvdW50IHdoZW4gY2FsbGluZwor
ICAgIC8vIFNjcmlwdFRleHRPdXQgaW4gfGRyYXd8LiBPdGhlcndpc2UsIGRpZmZlcmVudCBydW5z
IHJlbmRlcmVkIGJ5CisgICAgLy8gZGlmZmVyZW50IGZvbnRzIHdvdWxkIG5vdCBiZSBhbGlnbmVk
IHZlcnRpY2FsbHkuCisgICAgc2hhcGluZy5tX2FzY2VudE9mZnNldCA9IG1fYXNjZW50ID8gYXNj
ZW50IC0gbV9hc2NlbnQgOiAwOworICAgIHJlc3VsdCA9IHRydWU7CisKKyAgY2xlYW51cDoKKyAg
ICBzaGFwaW5nLm1fZ2x5cGhzLnJlc2l6ZShnZW5lcmF0ZWRHbHlwaHMpOworICAgIHNoYXBpbmcu
bV92aXN1YWxBdHRyaWJ1dGVzLnJlc2l6ZShnZW5lcmF0ZWRHbHlwaHMpOworICAgIHNoYXBpbmcu
bV9hZHZhbmNlLnJlc2l6ZShnZW5lcmF0ZWRHbHlwaHMpOworICAgIHNoYXBpbmcubV9vZmZzZXRz
LnJlc2l6ZShnZW5lcmF0ZWRHbHlwaHMpOworICAgIGlmICh0ZW1wREMpIHsKKyAgICAgICAgU2Vs
ZWN0T2JqZWN0KHRlbXBEQywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCB0ZW1wREMp
OworICAgIH0KKyAgICAvLyBPbiBmYWlsdXJlLCBvdXIgbG9ncyBkb24ndCBtZWFuIGFueXRoaW5n
LCBzbyB6ZXJvIHRob3NlIG91dC4KKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgc2hhcGluZy5t
X2xvZ3MuY2xlYXIoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVW5pc2NyaWJl
SGVscGVyOjpmaWxsU2hhcGVzKCkKK3sKKyAgICBtX3NoYXBlcy5yZXNpemUobV9ydW5zLnNpemUo
KSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3J1bnMuc2l6ZSgpOyBpKyspIHsKKyAg
ICAgICAgaW50IHN0YXJ0SXRlbSA9IG1fcnVuc1tpXS5pQ2hhclBvczsKKyAgICAgICAgaW50IGl0
ZW1MZW5ndGggPSBtX2lucHV0TGVuZ3RoIC0gc3RhcnRJdGVtOworICAgICAgICBpZiAoaSA8IG1f
cnVucy5zaXplKCkgLSAxKQorICAgICAgICAgICAgaXRlbUxlbmd0aCA9IG1fcnVuc1tpICsgMV0u
aUNoYXJQb3MgLSBzdGFydEl0ZW07CisKKyAgICAgICAgaW50IG51bUdseXBoczsKKyAgICAgICAg
aWYgKGl0ZW1MZW5ndGggPCBVTklTQ1JJQkVfSEVMUEVSX1NUQUNLX0NIQVJTKSB7CisgICAgICAg
ICAgICAvLyBXZSdsbCBzdGFydCBvdXIgYnVmZmVyIHNpemVzIHdpdGggdGhlIGN1cnJlbnQgc3Rh
Y2sgc3BhY2UKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbiBvdXIgYnVmZmVycyBpZiB0aGUg
Y3VycmVudCBpbnB1dCBmaXRzLiBBcyBsb25nIGFzCisgICAgICAgICAgICAvLyBpdCBkb2Vzbid0
IGV4cGFuZCBwYXN0IHRoYXQgd2UnbGwgc2F2ZSBhIGxvdCBvZiB0aW1lIG1hbGxvY2luZy4KKyAg
ICAgICAgICAgIG51bUdseXBocyA9IFVOSVNDUklCRV9IRUxQRVJfU1RBQ0tfQ0hBUlM7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXaGVuIHRoZSBpbnB1dCBkb2Vzbid0IGZpdCwg
Z2l2ZSB1cCB3aXRoIHRoZSBzdGFjayBzaW5jZSBpdCB3aWxsCisgICAgICAgICAgICAvLyBhbG1v
c3Qgc3VyZWx5IG5vdCBiZSBlbm91Z2ggcm9vbSAodW5sZXNzIHRoZSBpbnB1dCBhY3R1YWxseQor
ICAgICAgICAgICAgLy8gc2hyaW5rcywgd2hpY2ggaXMgdW5saWtlbHkpIGFuZCBqdXN0IHN0YXJ0
IHdpdGggdGhlIGxlbmd0aAorICAgICAgICAgICAgLy8gcmVjb21tZW5kZWQgYnkgdGhlIFVuaXNj
cmliZSBkb2N1bWVudGF0aW9uIGFzIGEgInVzdWFsbHkgZml0cyIKKyAgICAgICAgICAgIC8vIHNp
emUuCisgICAgICAgICAgICBudW1HbHlwaHMgPSBpdGVtTGVuZ3RoICogMyAvIDIgKyAxNjsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBnbHlwaCBzdHJpbmcg
dHJ5aW5nIHRoZSBwcmltYXJ5IGZvbnQsIGZvbnRzIGluCisgICAgICAgIC8vIHRoZSBmYWxsYmFj
ayBsaXN0IGFuZCB0aGVuIHNjcmlwdC1zcGVjaWZpYyBsYXN0IHJlc29ydCBmb250LgorICAgICAg
ICBTaGFwaW5nJiBzaGFwaW5nID0gbV9zaGFwZXNbaV07CisgICAgICAgIGlmICghc2hhcGUoJm1f
aW5wdXRbc3RhcnRJdGVtXSwgaXRlbUxlbmd0aCwgbnVtR2x5cGhzLCBtX3J1bnNbaV0sIHNoYXBp
bmcpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBwbGFjZW1l
bnRzLiBOb3RlIHRoYXQgb2Zmc2V0cyBpcyBkb2N1bWVudGVkIGluY29ycmVjdGx5CisgICAgICAg
IC8vIGFuZCBpcyBhY3R1YWxseSBhbiBhcnJheS4KKworICAgICAgICAvLyBEQyB0aGF0IHdlIGxh
emlseSBjcmVhdGUgaWYgVW5pc2NyaWJlIGNvbW1hbmRzIHVzIHRvLgorICAgICAgICAvLyAodGhp
cyBkb2VzIG5vdCBoYXBwZW4gb2Z0ZW4gYmVjYXVzZSBzY3JpcHRDYWNoZSBpcyBhbHJlYWR5Cisg
ICAgICAgIC8vICB1cGRhdGVkIHdoZW4gY2FsbGluZyBTY3JpcHRTaGFwZSkuCisgICAgICAgIEhE
QyB0ZW1wREMgPSAwOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSAwOworICAgICAgICBIUkVT
VUxUIGhyOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc2hhcGluZy5tX3By
ZVBhZGRpbmcgPSAwOworICAgICAgICAgICAgaHIgPSBTY3JpcHRQbGFjZSh0ZW1wREMsIHNoYXBp
bmcubV9zY3JpcHRDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXBpbmcu
bV9nbHlwaHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGlu
dD4oc2hhcGluZy5tX2dseXBocy5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmc2hhcGluZy5tX3Zpc3VhbEF0dHJpYnV0ZXNbMF0sICZtX3J1bnNbaV0uYSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJnNoYXBpbmcubV9hZHZhbmNlWzBdLCAmc2hhcGluZy5tX29m
ZnNldHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFwaW5nLm1fYWJjKTsK
KyAgICAgICAgICAgIGlmIChociAhPSBFX1BFTkRJTkcpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBEQyBhbmQgcnVuIHRoZSBsb29wIGFnYWlu
LgorICAgICAgICAgICAgdGVtcERDID0gR2V0REMoMCk7CisgICAgICAgICAgICBvbGRGb250ID0g
U2VsZWN0T2JqZWN0KHRlbXBEQywgc2hhcGluZy5tX2hmb250KTsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICAvLyBTb21lIGVycm9yIHdlIGRvbid0
IGtub3cgaG93IHRvIGhhbmRsZS4gTnVrZSBhbGwgb2Ygb3VyIGRhdGEKKyAgICAgICAgICAgIC8v
IHNpbmNlIHdlIGNhbid0IGRlYWwgd2l0aCBwYXJ0aWFsbHkgdmFsaWQgZGF0YSBsYXRlci4KKyAg
ICAgICAgICAgIG1fcnVucy5jbGVhcigpOworICAgICAgICAgICAgbV9zaGFwZXMuY2xlYXIoKTsK
KyAgICAgICAgICAgIG1fc2NyZWVuT3JkZXIuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICh0ZW1wREMpIHsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdCh0ZW1wREMsIG9sZEZvbnQp
OworICAgICAgICAgICAgUmVsZWFzZURDKDAsIHRlbXBEQyk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBhZGp1c3RTcGFjZUFkdmFuY2VzKCk7CisKKyAgICBpZiAobV9sZXR0ZXJTcGFjaW5nICE9
IDAgfHwgbV93b3JkU3BhY2luZyAhPSAwKQorICAgICAgICBhcHBseVNwYWNpbmcoKTsKK30KKwor
dm9pZCBVbmlzY3JpYmVIZWxwZXI6OmZpbGxTY3JlZW5PcmRlcigpCit7CisgICAgbV9zY3JlZW5P
cmRlci5yZXNpemUobV9ydW5zLnNpemUoKSk7CisKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUg
aW5wdXQgaGFzIG9ubHkgb25lIHRleHQgZGlyZWN0aW9uIGluIGl0LgorICAgIC8vIFRPRE8oYnJl
dHR3KSBhcmUgd2Ugc3VyZSB3ZSB3YW50IHRvIGtlZXAgdGhpcyByZXN0cmljdGlvbj8KKyAgICBp
ZiAobV9pc1J0bCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGlu
dD4obV9zY3JlZW5PcmRlci5zaXplKCkpOyBpKyspCisgICAgICAgICAgICBtX3NjcmVlbk9yZGVy
W3N0YXRpY19jYXN0PGludD4obV9zY3JlZW5PcmRlci5zaXplKCkpIC0gaSAtIDFdID0gaTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGludD4o
bV9zY3JlZW5PcmRlci5zaXplKCkpOyBpKyspCisgICAgICAgICAgICBtX3NjcmVlbk9yZGVyW2ld
ID0gaTsKKyAgICB9Cit9CisKK3ZvaWQgVW5pc2NyaWJlSGVscGVyOjphZGp1c3RTcGFjZUFkdmFu
Y2VzKCkKK3sKKyAgICBpZiAobV9zcGFjZVdpZHRoID09IDApCisgICAgICAgIHJldHVybjsKKwor
ICAgIGludCBzcGFjZVdpZHRoV2l0aG91dExldHRlclNwYWNpbmcgPSBtX3NwYWNlV2lkdGggLSBt
X2xldHRlclNwYWNpbmc7CisKKyAgICAvLyBUaGlzIG1vc3RseSBtYXRjaGVzIHdoYXQgV2ViS2l0
J3MgVW5pc2NyaWJlQ29udHJvbGxlcjo6c2hhcGVBbmRQbGFjZUl0ZW0uCisgICAgZm9yIChzaXpl
X3QgcnVuID0gMDsgcnVuIDwgbV9ydW5zLnNpemUoKTsgcnVuKyspIHsKKyAgICAgICAgU2hhcGlu
ZyYgc2hhcGluZyA9IG1fc2hhcGVzW3J1bl07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBzaGFwaW5nLmNoYXJMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXRyZWF0QXNT
cGFjZShtX2lucHV0W21fcnVuc1tydW5dLmlDaGFyUG9zICsgaV0pKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgICAgICBpbnQgZ2x5cGhJbmRleCA9IHNoYXBpbmcubV9sb2dz
W2ldOworICAgICAgICAgICAgaW50IGN1cnJlbnRBZHZhbmNlID0gc2hhcGluZy5tX2FkdmFuY2Vb
Z2x5cGhJbmRleF07CisgICAgICAgICAgICAvLyBEb24ndCBnaXZlIHplcm8td2lkdGggc3BhY2Vz
IGEgd2lkdGguCisgICAgICAgICAgICBpZiAoIWN1cnJlbnRBZHZhbmNlKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBjdXJyZW50QWR2YW5jZSBkb2VzIG5vdCBp
bmNsdWRlIGFkZGl0aW9uYWwgbGV0dGVyLXNwYWNpbmcsIGJ1dAorICAgICAgICAgICAgLy8gc3Bh
Y2Vfd2lkdGggZG9lcy4gSGVyZSB3ZSBmaW5kIG91dCBob3cgb2ZmIHdlIGFyZSBmcm9tIHRoZQor
ICAgICAgICAgICAgLy8gY29ycmVjdCB3aWR0aCBmb3IgdGhlIHNwYWNlIG5vdCBpbmNsdWRpbmcg
bGV0dGVyLXNwYWNpbmcsIHRoZW4KKyAgICAgICAgICAgIC8vIGp1c3Qgc3VidHJhY3QgdGhhdCBk
aWZmLgorICAgICAgICAgICAgaW50IGRpZmYgPSBjdXJyZW50QWR2YW5jZSAtIHNwYWNlV2lkdGhX
aXRob3V0TGV0dGVyU3BhY2luZzsKKyAgICAgICAgICAgIC8vIFRoZSBzaGFwaW5nIGNhbiBjb25z
aXN0IG9mIGEgcnVuIG9mIHRleHQsIHNvIG9ubHkgc3VidHJhY3QgdGhlCisgICAgICAgICAgICAv
LyBkaWZmZXJlbmNlIGluIHRoZSB3aWR0aCBvZiB0aGUgZ2x5cGguCisgICAgICAgICAgICBzaGFw
aW5nLm1fYWR2YW5jZVtnbHlwaEluZGV4XSAtPSBkaWZmOworICAgICAgICAgICAgc2hhcGluZy5t
X2FiYy5hYmNCIC09IGRpZmY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVW5pc2NyaWJl
SGVscGVyOjphcHBseVNwYWNpbmcoKQoreworICAgIGZvciAoc2l6ZV90IHJ1biA9IDA7IHJ1biA8
IG1fcnVucy5zaXplKCk7IHJ1bisrKSB7CisgICAgICAgIFNoYXBpbmcmIHNoYXBpbmcgPSBtX3No
YXBlc1tydW5dOworICAgICAgICBib29sIGlzUnRsID0gbV9ydW5zW3J1bl0uYS5mUlRMOworCisg
ICAgICAgIGlmIChtX2xldHRlclNwYWNpbmcgIT0gMCkgeworICAgICAgICAgICAgLy8gUlRMIHRl
eHQgZ2V0cyBwYWRkZWQgdG8gdGhlIGxlZnQgb2YgZWFjaCBjaGFyYWN0ZXIuIFdlIGluY3JlbWVu
dAorICAgICAgICAgICAgLy8gdGhlIHJ1bidzIGFkdmFuY2UgdG8gbWFrZSB0aGlzIGhhcHBlbi4g
VGhpcyB3aWxsIGJlIGJhbGFuY2VkIG91dAorICAgICAgICAgICAgLy8gYnkgTk9UIGFkZGluZyBh
ZGRpdGlvbmFsIGFkdmFuY2UgdG8gdGhlIGxhc3QgZ2x5cGggaW4gdGhlIHJ1bi4KKyAgICAgICAg
ICAgIGlmIChpc1J0bCkKKyAgICAgICAgICAgICAgICBzaGFwaW5nLm1fcHJlUGFkZGluZyArPSBt
X2xldHRlclNwYWNpbmc7CisKKyAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBnbHlw
aHMgaW4gdGhpcyBydW4gYW5kIGluY3JlYXNlIHRoZSAiYWR2YW5jZSIKKyAgICAgICAgICAgIC8v
IHRvIGFjY291bnQgZm9yIGxldHRlciBzcGFjaW5nLiBXZSBhZGp1c3QgbGV0dGVyIHNwYWNpbmcg
b25seSBvbgorICAgICAgICAgICAgLy8gY2x1c3RlciBib3VuZGFyaWVzLgorICAgICAgICAgICAg
Ly8KKyAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIG1vc3Qgc2NyaXB0cywgYnV0IG1heSBo
YXZlIHByb2JsZW1zIHdpdGggc29tZQorICAgICAgICAgICAgLy8gaW5kaWMgc2NyaXB0cy4gVGhp
cyBiZWhhdmlvciBpcyBiZXR0ZXIgdGhhbiBGaXJlZm94IG9yIElFIGZvcgorICAgICAgICAgICAg
Ly8gSGVicmV3LgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwaW5nLmdseXBo
TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzaGFwaW5nLm1fdmlzdWFsQXR0
cmlidXRlc1tpXS5mQ2x1c3RlclN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEljaywg
d2UgbmVlZCB0byBhc3NpZ24gdGhlIGV4dHJhIHNwYWNlIHNvIHRoYXQgdGhlIGdseXBoCisgICAg
ICAgICAgICAgICAgICAgIC8vIGNvbWVzIGZpcnN0LCB0aGVuIGlzIGZvbGxvd2VkIGJ5IHRoZSBz
cGFjZS4gVGhpcyBpcworICAgICAgICAgICAgICAgICAgICAvLyBvcHBvc2l0ZSBmb3IgUlRMLgor
ICAgICAgICAgICAgICAgICAgICBpZiAoaXNSdGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChpICE9IHNoYXBpbmcuZ2x5cGhMZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBBbGwgYnV0IHRoZSBsYXN0IGNoYXJhY3RlciBqdXN0IGdldCB0aGUgc3Bh
Y2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpZWQgdG8gdGhlaXIgYWR2
YW5jZS4gVGhlIGxhc3QgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
ZG9lc24ndCBnZXQgYW55dGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGlu
Zy5tX2FkdmFuY2VbaV0gKz0gbV9sZXR0ZXJTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNoYXBpbmcubV9hYmMuYWJjQiArPSBtX2xldHRlclNwYWNpbmc7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBMVFIgY2FzZSBpcyBlYXNpZXIsIHdlIGp1c3QgYWRkIHRvIHRoZSBh
ZHZhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZy5tX2FkdmFuY2VbaV0gKz0g
bV9sZXR0ZXJTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZy5tX2FiYy5h
YmNCICs9IG1fbGV0dGVyU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdvIHRocm91
Z2ggYWxsIHRoZSBjaGFyYWN0ZXJzIHRvIGZpbmQgd2hpdGVzcGFjZSBhbmQgaW5zZXJ0IHRoZQor
ICAgICAgICAvLyBleHRyYSB3b3Jkc3BhY2luZyBhbW91bnQgZm9yIHRoZSBnbHlwaHMgdGhleSBj
b3JyZXNwb25kIHRvLgorICAgICAgICBpZiAobV93b3JkU3BhY2luZyAhPSAwKSB7CisgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYXBpbmcuY2hhckxlbmd0aCgpOyBpKyspIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIXRyZWF0QXNTcGFjZShtX2lucHV0W21fcnVuc1tydW5dLmlDaGFy
UG9zICsgaV0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAg
ICAgIC8vIFRoZSBjaGFyIGluIHF1ZXN0aW9uIGlzIGEgd29yZCBzZXBhcmF0b3IuLi4KKyAgICAg
ICAgICAgICAgICBpbnQgZ2x5cGhJbmRleCA9IHNoYXBpbmcubV9sb2dzW2ldOworCisgICAgICAg
ICAgICAgICAgLy8gU3BhY2VzIHdpbGwgbm90IGhhdmUgYSBnbHlwaCBpbiBVbmlzY3JpYmUsIGl0
IHdpbGwganVzdCBhZGQKKyAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGFkdmFuY2UgdG8g
dGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBzcGFj
ZS4gVGhlIHNwYWNlJ3MgY29ycmVzcG9uZGluZyBnbHlwaCB3aWxsIGJlIHRoZSBjaGFyYWN0ZXIK
KyAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgaXQgaW4gcmVhZGluZyBvcmRlci4KKyAgICAg
ICAgICAgICAgICBpZiAoaXNSdGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gUlRMLCB0
aGUgZ2x5cGggdG8gdGhlIGxlZnQgb2YgdGhlIHNwYWNlIGlzIHRoZSBzYW1lCisgICAgICAgICAg
ICAgICAgICAgIC8vIGFzIHRoZSBmaXJzdCBnbHlwaCBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3Rl
ciwgc28gd2UgY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgaW5jcmVtZW50IGl0Lgor
ICAgICAgICAgICAgICAgICAgICBzaGFwaW5nLm1fYWR2YW5jZVtnbHlwaEluZGV4XSArPSBtX3dv
cmRTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICBzaGFwaW5nLm1fYWJjLmFiY0IgKz0gbV93
b3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICAvLyBMVFIgaXMgYWN0dWFsbHkgbW9yZSBjb21wbGV4IGhlcmUsIHdlIGFwcGx5IGl0IHRvIHRo
ZQorICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMg
b25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBp
dCB0byB0aGUgbGVhZGluZyBzcGFjZSBvZiB0aGUgcnVuLgorICAgICAgICAgICAgICAgICAgICBp
ZiAoZ2x5cGhJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZy5tX3By
ZVBhZGRpbmcgKz0gbV93b3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzaGFwaW5nLm1fYWR2YW5jZVtnbHlwaEluZGV4IC0gMV0g
Kz0gbV93b3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBpbmcubV9hYmMu
YWJjQiArPSBtX3dvcmRTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAvLyBtX3dvcmRTcGFjaW5nICE9IDAK
KworICAgICAgICAvLyBMb29wIGZvciBuZXh0IHJ1bi4uLgorICAgIH0KK30KKworLy8gVGhlIGFk
dmFuY2UgaXMgdGhlIEFCQyB3aWR0aCBvZiB0aGUgcnVuCitpbnQgVW5pc2NyaWJlSGVscGVyOjph
ZHZhbmNlRm9ySXRlbShpbnQgaXRlbUluZGV4KSBjb25zdAoreworICAgIGludCBhY2N1bSA9IDA7
CisgICAgY29uc3QgU2hhcGluZyYgc2hhcGluZyA9IG1fc2hhcGVzW2l0ZW1JbmRleF07CisKKyAg
ICBpZiAoc2hhcGluZy5tX2p1c3RpZnkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gRWFzeSBj
YXNlIHdpdGggbm8ganVzdGlmaWNhdGlvbiwgdGhlIHdpZHRoIGlzIGp1c3QgdGhlIEFCQyB3aWR0
aCBvZgorICAgICAgICAvLyB0aGUgcnVuLiAoVGhlIEFCQyB3aWR0aCBpcyB0aGUgc3VtIG9mIHRo
ZSBhZHZhbmNlcykuCisgICAgICAgIHJldHVybiBzaGFwaW5nLm1fYWJjLmFiY0EgKyBzaGFwaW5n
Lm1fYWJjLmFiY0IgKworICAgICAgICAgICAgICAgc2hhcGluZy5tX2FiYy5hYmNDICsgc2hhcGlu
Zy5tX3ByZVBhZGRpbmc7CisgICAgfQorCisgICAgLy8gV2l0aCBqdXN0aWZpY2F0aW9uLCB3ZSB1
c2UgdGhlIGp1c3RpZmllZCBhbW91bnRzIGluc3RlYWQuIFRoZQorICAgIC8vIGp1c3RpZmljYXRp
b24gYXJyYXkgY29udGFpbnMgYm90aCB0aGUgYWR2YW5jZSBhbmQgdGhlIGV4dHJhIHNwYWNlCisg
ICAgLy8gYWRkZWQgZm9yIGp1c3RpZmljYXRpb24sIHNvIGlzIHRoZSB3aWR0aCB3ZSB3YW50Lgor
ICAgIGludCBqdXN0aWZpY2F0aW9uID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNo
YXBpbmcubV9qdXN0aWZ5LnNpemUoKTsgaSsrKQorICAgICAgICBqdXN0aWZpY2F0aW9uICs9IHNo
YXBpbmcubV9qdXN0aWZ5W2ldOworCisgICAgcmV0dXJuIHNoYXBpbmcubV9wcmVQYWRkaW5nICsg
anVzdGlmaWNhdGlvbjsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVW5pc2NyaWJlSGVscGVyLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTRkODYKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlci5oCkBA
IC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3LCAyMDA4LCAy
MDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIEEgd3JhcHBlciBhcm91bmQg
VW5pc2NyaWJlIHRoYXQgcHJvdmlkZXMgYSByZWFzb25hYmxlIEFQSS4KKworI2lmbmRlZiBVbmlz
Y3JpYmVIZWxwZXJfaAorI2RlZmluZSBVbmlzY3JpYmVIZWxwZXJfaAorCisjaW5jbHVkZSA8d2lu
ZG93cy5oPgorI2luY2x1ZGUgPHVzcDEwLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8
dW5pY29kZS91Y2hhci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworY2xhc3MgVW5pc2Ny
aWJlVGVzdF9Ub29CaWdfVGVzdDsgIC8vIEEgZ3VuaXQgdGVzdCBmb3IgVW5pc2NyaWJlSGVscGVy
LgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNkZWZpbmUgVU5JU0NSSUJFX0hFTFBFUl9TVEFD
S19SVU5TIDgKKyNkZWZpbmUgVU5JU0NSSUJFX0hFTFBFUl9TVEFDS19DSEFSUyAzMgorCisvLyBU
aGlzIG9iamVjdCBzaG91bGQgYmUgc2FmZSB0byBjcmVhdGUgJiBkZXN0cm95IGZyZXF1ZW50bHks
IGFzIGxvbmcgYXMgdGhlCisvLyBjYWxsZXIgcHJlc2VydmVzIHRoZSBzY3JpcHRfY2FjaGUgd2hl
biBwb3NzaWJsZSAodGhpcyBkYXRhIG1heSBiZSBzbG93IHRvCisvLyBjb21wdXRlKS4KKy8vCisv
LyBUaGlzIG9iamVjdCBpcyAia2luZCBvZiBsYXJnZSIgKH4xSykgYmVjYXVzZSBpdCByZXNlcnZl
cyBhIGxvdCBvZiBzcGFjZSBmb3IKKy8vIHdvcmtpbmcgd2l0aCB0byBhdm9pZCBleHBlbnNpdmUg
aGVhcCBvcGVyYXRpb25zLiBUaGVyZWZvcmUsIG5vdCBvbmx5IHNob3VsZAorLy8geW91IG5vdCB3
b3JyeSBhYm91dCBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBpdCwgeW91IHNob3VsZCB0cnkgdG8g
bm90IGtlZXAKKy8vIHRoZW0gYXJvdW5kLgorY2xhc3MgVW5pc2NyaWJlSGVscGVyIHsKK3B1Ymxp
YzoKKyAgICAvLyBJbml0aWFsaXplcyB0aGlzIFVuaXNjcmliZSBydW4gd2l0aCB0aGUgdGV4dCBw
b2ludGVkIHRvIGJ5IHxydW58IHdpdGgKKyAgICAvLyB8bGVuZ3RofC4gVGhlIGlucHV0IGlzIE5P
VCBudWxsIHRlcm1pbmF0ZWQuCisgICAgLy8KKyAgICAvLyBUaGUgaXNfcnRsIGZsYWcgc2hvdWxk
IGJlIHNldCBpZiB0aGUgaW5wdXQgc2NyaXB0IGlzIFJUTC4gSXQgaXMgYXNzdW1lZAorICAgIC8v
IHRoYXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBkaXZpZGVkIHVwIHRoZSBpbnB1dCB0ZXh0ICh1
c2luZyBJQ1UsIGZvcgorICAgIC8vIGV4YW1wbGUpIGludG8gcnVucyBvZiB0aGUgc2FtZSBkaXJl
Y3Rpb24gb2Ygc2NyaXB0LiBUaGlzIGF2b2lkcworICAgIC8vIGRpc2FncmVlbWVudHMgYmV0d2Vl
biB0aGUgY2FsbGVyIGFuZCBVbmlzY3JpYmUgbGF0ZXIgKHNlZSBGaWxsSXRlbXMpLgorICAgIC8v
CisgICAgLy8gQSBzY3JpcHQgY2FjaGUgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIg
dGhhdCBpcyBpbml0aWFsaXplZCB0bworICAgIC8vIE5VTEwuIFdoZW4gdGhlIGNhbGxlciBpcyBk
b25lIHdpdGggdGhlIGNhY2hlIChpdCBtYXkgYmUgc3RvcmVkIGJldHdlZW4KKyAgICAvLyBydW5z
IGFzIGxvbmcgYXMgaXQgaXMgdXNlZCBjb25zaXN0ZW50bHkgd2l0aCB0aGUgc2FtZSBIRk9OVCks
IGl0IHNob3VsZAorICAgIC8vIGNhbGwgU2NyaXB0RnJlZUNhY2hlKCkuCisgICAgVW5pc2NyaWJl
SGVscGVyKGNvbnN0IFVDaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0
TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzUnRsLAorICAgICAgICAgICAgICAg
ICAgICBIRk9OVCwKKyAgICAgICAgICAgICAgICAgICAgU0NSSVBUX0NBQ0hFKiwKKyAgICAgICAg
ICAgICAgICAgICAgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKik7CisKKyAgICB2aXJ0dWFsIH5Vbmlz
Y3JpYmVIZWxwZXIoKTsKKworICAgIC8vIFNldHMgVW5pc2NyaWJlJ3MgZGlyZWN0aW9uYWwgb3Zl
cnJpZGUgZmxhZy4gRmFsc2UgYnkgZGVmYXVsdC4KKyAgICBib29sIGRpcmVjdGlvbmFsT3ZlcnJp
ZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZGlyZWN0aW9uYWxPdmVycmlkZTsK
KyAgICB9CisgICAgdm9pZCBzZXREaXJlY3Rpb25hbE92ZXJyaWRlKGJvb2wgb3ZlcnJpZGUpCisg
ICAgeworICAgICAgICBtX2RpcmVjdGlvbmFsT3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICB9CisK
KyAgICAvLyBTZXQncyBVbmlzY3JpYmUncyBuby1saWdhdGUgb3ZlcnJpZGUgZmxhZy4gRmFsc2Ug
YnkgZGVmYXVsdC4KKyAgICBib29sIGluaGliaXRMaWdhdGUoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1faW5oaWJpdExpZ2F0ZTsKKyAgICB9CisgICAgdm9pZCBzZXRJbmhpYml0TGln
YXRlKGJvb2wgaW5oaWJpdCkKKyAgICB7CisgICAgICAgIG1faW5oaWJpdExpZ2F0ZSA9IGluaGli
aXQ7CisgICAgfQorCisgICAgLy8gU2V0IGxldHRlciBzcGFjaW5nLiBXZSB3aWxsIHRyeSB0byBp
bnNlcnQgdGhpcyBtdWNoIHNwYWNlIGJldHdlZW4KKyAgICAvLyBncmFwaGVtZXMgKG9uZSBvciBt
b3JlIGdseXBocyBwZXJjZWl2ZWQgYXMgYSBzaW5nbGUgdW5pdCBieSBvcmRpbmFyeQorICAgIC8v
IHVzZXJzIG9mIGEgc2NyaXB0KS4gUG9zaXRpdmUgdmFsdWVzIGluY3JlYXNlIGxldHRlciBzcGFj
aW5nLCBuZWdhdGl2ZQorICAgIC8vIHZhbHVlcyBkZWNyZWFzZSBpdC4gMCBieSBkZWZhdWx0Lgor
ICAgIGludCBsZXR0ZXJTcGFjaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xl
dHRlclNwYWNpbmc7CisgICAgfQorICAgIHZvaWQgc2V0TGV0dGVyU3BhY2luZyhpbnQgbGV0dGVy
U3BhY2luZykKKyAgICB7CisgICAgICAgIG1fbGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmc7
CisgICAgfQorCisgICAgLy8gU2V0IHRoZSB3aWR0aCBvZiBhIHN0YW5kYXJkIHNwYWNlIGNoYXJh
Y3Rlci4gV2UgdXNlIHRoaXMgdG8gbm9ybWFsaXplCisgICAgLy8gc3BhY2Ugd2lkdGhzLiBXaW5k
b3dzIHdpbGwgbWFrZSBzcGFjZXMgYWZ0ZXIgSGluZGkgY2hhcmFjdGVycyBsYXJnZXIgdGhhbgor
ICAgIC8vIG90aGVyIHNwYWNlcy4gQSBzcGFjZV93aWR0aCBvZiAwIG1lYW5zIHRvIHVzZSB0aGUg
ZGVmYXVsdCBzcGFjZSB3aWR0aC4KKyAgICAvLworICAgIC8vIE11c3QgYmUgc2V0IGJlZm9yZSBJ
bml0KCkgaXMgY2FsbGVkLgorICAgIGludCBzcGFjZVdpZHRoKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX3NwYWNlV2lkdGg7CisgICAgfQorICAgIHZvaWQgc2V0U3BhY2VXaWR0aChp
bnQgc3BhY2VXaWR0aCkKKyAgICB7CisgICAgICAgIG1fc3BhY2VXaWR0aCA9IHNwYWNlV2lkdGg7
CisgICAgfQorCisgICAgLy8gU2V0IHdvcmQgc3BhY2luZy4gV2Ugd2lsbCB0cnkgdG8gaW5zZXJ0
IHRoaXMgbXVjaCBleHRyYSBzcGFjZSBiZXR3ZWVuCisgICAgLy8gZWFjaCB3b3JkIGluIHRoZSBp
bnB1dCAoYmV5b25kIHdoYXRldmVyIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHNlcGFyYXRlcworICAg
IC8vIHdvcmRzKS4gUG9zaXRpdmUgdmFsdWVzIGxlYWQgdG8gaW5jcmVhc2VkIGxldHRlciBzcGFj
aW5nLCBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAvLyBkZWNyZWFzZSBpdC4gMCBieSBkZWZhdWx0Lgor
ICAgIC8vCisgICAgLy8gTXVzdCBiZSBzZXQgYmVmb3JlIEluaXQoKSBpcyBjYWxsZWQuCisgICAg
aW50IHdvcmRTcGFjaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3dvcmRTcGFj
aW5nOworICAgIH0KKyAgICB2b2lkIHNldFdvcmRTcGFjaW5nKGludCB3b3JkU3BhY2luZykKKyAg
ICB7CisgICAgICAgIG1fd29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZzsKKyAgICB9CisKKyAgICB2
b2lkIHNldEFzY2VudChpbnQgYXNjZW50KQorICAgIHsKKyAgICAgICAgbV9hc2NlbnQgPSBhc2Nl
bnQ7CisgICAgfQorCisgICAgLy8gWW91IG11c3QgY2FsbCB0aGlzIGFmdGVyIHNldHRpbmcgYW55
IG9wdGlvbnMgYnV0IGJlZm9yZSBkb2luZyBhbnkKKyAgICAvLyBvdGhlciBjYWxscyBsaWtlIGFz
a2luZyBmb3Igd2lkdGhzIG9yIGRyYXdpbmcuCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAg
ICAgIGluaXRXaXRoT3B0aW9uYWxMZW5ndGhQcm90ZWN0aW9uKHRydWUpOworICAgIH0KKworICAg
IC8vIFJldHVybnMgdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgdGV4dCBydW4uCisg
ICAgaW50IHdpZHRoKCkgY29uc3Q7CisKKyAgICAvLyBDYWxsIHRvIGp1c3RpZnkgdGhlIHRleHQs
IHdpdGggdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IHNob3VsZCBiZSBBRERFRAorICAgIC8vIHRv
IGdldCB0aGUgZGVzaXJlZCB3aWR0aCB0aGF0IHRoZSBjb2x1bW4gc2hvdWxkIGJlIGp1c3RpZmll
ZCB0by4KKyAgICAvLyBOb3JtYWxseSwgc3BhY2VzIGFyZSBpbnNlcnRlZCwgYnV0IGZvciBBcmFi
aWMgdGhlcmUgd2lsbCBiZSBrYXNoaWRhcworICAgIC8vIChleHRyYSBzdHJva2VzKSBpbnNlcnRl
ZCBpbnN0ZWFkLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCBB
RlRFUiBJbml0KCkuCisgICAgdm9pZCBqdXN0aWZ5KGludCBhZGRpdGlvbmFsU3BhY2UpOworCisg
ICAgLy8gQ29tcHV0ZXMgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQgaW50byBhIHBpeGVsIG9m
ZnNldCBvZiB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgdGhhdCBjaGFyYWN0ZXIuCisgICAgaW50
IGNoYXJhY3RlclRvWChpbnQgb2Zmc2V0KSBjb25zdDsKKworICAgIC8vIENvbnZlcnRzIHRoZSBn
aXZlbiBwaXhlbCBYIHBvc2l0aW9uIGludG8gYSBsb2dpY2FsIGNoYXJhY3RlciBvZmZzZXQgaW50
bworICAgIC8vIHRoZSBydW4uIEZvciBwb3NpdGlvbnMgYXBwZWFyaW5nIGJlZm9yZSB0aGUgZmly
c3QgY2hhcmFjdGVyLCB0aGlzIHdpbGwKKyAgICAvLyByZXR1cm4gLTEuCisgICAgaW50IHhUb0No
YXJhY3RlcihpbnQgeCkgY29uc3Q7CisKKyAgICAvLyBEcmF3cyB0aGUgZ2l2ZW4gY2hhcmFjdGVy
cyB0byAoeCwgeSkgaW4gdGhlIGdpdmVuIERDLiBUaGUgZm9udCB3aWxsIGJlCisgICAgLy8gaGFu
ZGxlZCBieSB0aGlzIGZ1bmN0aW9uLCBidXQgdGhlIGZvbnQgY29sb3IgYW5kIG90aGVyIGF0dHJp
YnV0ZXMgc2hvdWxkCisgICAgLy8gYmUgcHJlLXNldC4KKyAgICAvLworICAgIC8vIFRoZSB5IHBv
c2l0aW9uIGlzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciwgTk9UIHRoZSBiYXNlbGluZS4KKyAgICB2
b2lkIGRyYXcoSERDLCBpbnQgeCwgaW50IHksIGludCBmcm9tLCBpbnQgdG8pOworCisgICAgLy8g
UmV0dXJucyB0aGUgZmlyc3QgZ2x5cGggYXNzaWduZWQgdG8gdGhlIGNoYXJhY3RlciBhdCB0aGUg
Z2l2ZW4gb2Zmc2V0LgorICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBn
bHlwaCBpbmZvcm1hdGlvbiB3aGVuIFVuaXNjcmliZSBpcworICAgIC8vIGJlaW5nIHVzZWQgdG8g
Z2VuZXJhdGUgZ2x5cGhzIGZvciBub24tY29tcGxleCwgbm9uLUJNUCAoYWJvdmUgVStGRkZGKQor
ICAgIC8vIGNoYXJhY3RlcnMuIFRoZXNlIGNoYXJhY3RlcnMgYXJlIG5vdCBvdGhlcndpc2Ugc3Bl
Y2lhbCBhbmQgaGF2ZSBubworICAgIC8vIGNvbXBsZXggc2hhcGluZyBydWxlcywgc28gd2UgZG9u
J3Qgb3RoZXJ3aXNlIG5lZWQgVW5pc2NyaWJlLCBleGNlcHQKKyAgICAvLyBVbmlzY3JpYmUgaXMg
dGhlIG9ubHkgd2F5IHRvIGdldCBnbHlwaHMgZm9yIG5vbi1CTVAgY2hhcmFjdGVycy4KKyAgICAv
LworICAgIC8vIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyBnbHlwaCBmb3IgdGhlIGdpdmVuIGNo
YXJhY3Rlci4KKyAgICBXT1JEIGZpcnN0R2x5cGhGb3JDaGFyYWN0ZXIoaW50IGNoYXJPZmZzZXQp
IGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgLy8gQmFja2VuZCBmb3IgaW5pdC4gVGhlIGZsYWcg
YWxsb3dzIHRoZSB1bml0IHRlc3QgdG8gc3BlY2lmeSB3aGV0aGVyIHdlCisgICAgLy8gc2hvdWxk
IGZhaWwgZWFybHkgZm9yIHZlcnkgbG9uZyBzdHJpbmdzIGxpa2Ugbm9ybWFsLCBvciB0cnkgdG8g
cGFzcyB0aGUKKyAgICAvLyBsb25nIHN0cmluZyB0byBVbmlzY3JpYmUuIFRoZSBsYXR0ZXIgcHJv
dmlkZXMgYSB3YXkgdG8gZm9yY2UgZmFpbHVyZSBvZgorICAgIC8vIHNoYXBpbmcuCisgICAgdm9p
ZCBpbml0V2l0aE9wdGlvbmFsTGVuZ3RoUHJvdGVjdGlvbihib29sIGxlbmd0aFByb3RlY3Rpb24p
OworCisgICAgLy8gVHJpZXMgdG8gcHJlbG9hZCB0aGUgZm9udCB3aGVuIHRoZSBpdCBpcyBub3Qg
YWNjZXNzaWJsZS4KKyAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFu
ZCBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgdHJ5VG9QcmVsb2Fk
Rm9udChIRk9OVCkge30KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgVW5pc2NyaWJlVGVz
dF9Ub29CaWdfVGVzdDsKKworICAgIC8vIEFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBp
dGVtIGluIHJ1bnNfIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24KKyAgICAvLyBvbiBlYWNoIG9mIHRo
ZSBnbHlwaHMgdGhhdCB3ZXJlIGdlbmVyYXRlZC4gTGlrZSBydW5zXywgdGhpcyBpcyBpbgorICAg
IC8vIHJlYWRpbmcgb3JkZXIuIEhvd2V2ZXIsIGZvciBydGwgdGV4dCwgdGhlIGNoYXJhY3RlcnMg
d2l0aGluIGVhY2gKKyAgICAvLyBpdGVtIHdpbGwgYmUgcmV2ZXJzZWQuCisgICAgc3RydWN0IFNo
YXBpbmcgeworICAgICAgICBTaGFwaW5nKCkKKyAgICAgICAgICAgIDogbV9wcmVQYWRkaW5nKDAp
CisgICAgICAgICAgICAsIG1faGZvbnQoTlVMTCkKKyAgICAgICAgICAgICwgbV9zY3JpcHRDYWNo
ZShOVUxMKQorICAgICAgICAgICAgLCBtX2FzY2VudE9mZnNldCgwKSB7CisgICAgICAgICAgICBt
X2FiYy5hYmNBID0gMDsKKyAgICAgICAgICAgIG1fYWJjLmFiY0IgPSAwOworICAgICAgICAgICAg
bV9hYmMuYWJjQyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1i
ZXIgb2YgZ2x5cGhzICh3aGljaCB3aWxsIGJlIGRyYXduIHRvIHRoZSBzY3JlZW4pCisgICAgICAg
IC8vIGluIHRoaXMgcnVuLgorICAgICAgICBpbnQgZ2x5cGhMZW5ndGgoKSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2dseXBocy5zaXplKCkp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3Rl
cnMgKHRoYXQgd2Ugc3RhcnRlZCB3aXRoKSBpbiB0aGlzIHJ1bi4KKyAgICAgICAgaW50IGNoYXJM
ZW5ndGgoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50PihtX2xvZ3Muc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgdGhl
IGFkdmFuY2UgYXJyYXkgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIG1lYXN1cmluZyBnbHlwaHMu
CisgICAgICAgIC8vIFRoZSByZXR1cm5lZCBwb2ludGVyIHdpbGwgaW5kaWNhdGUgYW4gYXJyYXkg
d2l0aCBnbHlwaF9sZW5ndGgoKQorICAgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIGFkdmFuY2Ug
dGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCBvbmUuIFRoaXMgaXMKKyAgICAgICAgLy8gZWl0
aGVyIHRoZSByZWFsIGFkdmFuY2UsIG9yIHRoZSBqdXN0aWZpZWQgYWR2YW5jZXMgaWYgdGhlcmUg
aXMgb25lLAorICAgICAgICAvLyBhbmQgaXMgdGhlIGFycmF5IHdlIHdhbnQgdG8gdXNlIGZvciBt
ZWFzdXJlbWVudC4KKyAgICAgICAgY29uc3QgaW50KiBlZmZlY3RpdmVBZHZhbmNlcygpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2FkdmFuY2Uuc2l6ZSgpID09IDApCisgICAg
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAobV9qdXN0aWZ5LnNpemUoKSA9
PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAmbV9hZHZhbmNlWzBdOworICAgICAgICAgICAg
cmV0dXJuICZtX2p1c3RpZnlbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIHRo
ZSBhZHZhbmNlIGFtb3VudCBvZiBzcGFjZSB0aGF0IHdlIGhhdmUgYWRkZWQgdG8gdGhlCisgICAg
ICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcnVuLiBJdCBpcyBsaWtlIHRoZSBBQkMncyB8QXwgYWR2
YW5jZSBidXQgb25lIHRoYXQKKyAgICAgICAgLy8gd2UgY3JlYXRlIGFuZCBtdXN0IGhhbmRsZSBp
bnRlcm5hbGx5IHdoZW5ldmVyIGNvbXB1dGluZyB3aXRoIHBpeGVsCisgICAgICAgIC8vIG9mZnNl
dHMuCisgICAgICAgIGludCBtX3ByZVBhZGRpbmc7CisKKyAgICAgICAgLy8gR2x5cGggaW5kaWNl
cyBpbiB0aGUgZm9udCB1c2VkIHRvIGRpc3BsYXkgdGhpcyBpdGVtLiBUaGVzZSBpbmRpY2VzCisg
ICAgICAgIC8vIGFyZSBpbiBzY3JlZW4gb3JkZXIuCisgICAgICAgIFZlY3RvcjxXT1JELCBVTklT
Q1JJQkVfSEVMUEVSX1NUQUNLX0NIQVJTPiBtX2dseXBoczsKKworICAgICAgICAvLyBGb3IgZWFj
aCBpbnB1dCBjaGFyYWN0ZXIsIHRoaXMgdGVsbHMgdXMgdGhlIGZpcnN0IGdseXBoIGluZGV4IGl0
CisgICAgICAgIC8vIGdlbmVyYXRlZC4gVGhpcyBpcyB0aGUgb25seSBhcnJheSB3aXRoIHNpemUg
b2YgdGhlIGlucHV0IGNoYXJzLgorICAgICAgICAvLworICAgICAgICAvLyBBbGwgb2Zmc2V0cyBh
cmUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgcnVuLiBNdWx0aXBsZSBjaGFyYWN0ZXJzCisg
ICAgICAgIC8vIGNhbiBnZW5lcmF0ZSBvbmUgZ2x5cGgsIGluIHdoaWNoIGNhc2UgdGhlcmUgd2ls
bCBiZSBhZGphY2VudAorICAgICAgICAvLyBkdXBsaWNhdGVzIGluIHRoaXMgbGlzdC4gT25lIGNo
YXJhY3RlciBjYW4gYWxzbyBnZW5lcmF0ZSBtdWx0aXBsZQorICAgICAgICAvLyBnbHlwaHMsIGlu
IHdoaWNoIGNhc2UgdGhlcmUgd2lsbCBiZSBza2lwcGVkIGluZGljZXMgaW4gdGhpcyBsaXN0Lgor
ICAgICAgICBWZWN0b3I8V09SRCwgVU5JU0NSSUJFX0hFTFBFUl9TVEFDS19DSEFSUz4gbV9sb2dz
OworCisgICAgICAgIC8vIEZsYWdzIGFuZCBzdWNoIGZvciBlYWNoIGdseXBoLgorICAgICAgICBW
ZWN0b3I8U0NSSVBUX1ZJU0FUVFIsIFVOSVNDUklCRV9IRUxQRVJfU1RBQ0tfQ0hBUlM+IG1fdmlz
dWFsQXR0cmlidXRlczsKKworICAgICAgICAvLyBIb3Jpem9udGFsIGFkdmFuY2VzIGZvciBlYWNo
IGdseXBoIGxpc3RlZCBhYm92ZSwgdGhpcyBpcyBiYXNpY2FsbHkKKyAgICAgICAgLy8gaG93IHdp
ZGUgZWFjaCBnbHlwaCBpcy4KKyAgICAgICAgVmVjdG9yPGludCwgVU5JU0NSSUJFX0hFTFBFUl9T
VEFDS19DSEFSUz4gbV9hZHZhbmNlOworCisgICAgICAgIC8vIFRoaXMgY29udGFpbnMgZ2x5cGgg
b2Zmc2V0cywgZnJvbSB0aGUgbm9taW5hbCBwb3NpdGlvbiBvZiBhIGdseXBoLgorICAgICAgICAv
LyBJdCBpcyB1c2VkIHRvIGFkanVzdCB0aGUgcG9zaXRpb25zIG9mIG11bHRpcGxlIGNvbWJpbmlu
ZyBjaGFyYWN0ZXJzCisgICAgICAgIC8vIGFyb3VuZC9hYm92ZS9iZWxvdyBiYXNlIGNoYXJhY3Rl
cnMgaW4gYSBjb250ZXh0LXNlbnNpdGl2ZSBtYW5uZXIgc28KKyAgICAgICAgLy8gdGhhdCB0aGV5
IGRvbid0IGJ1bXAgYWdhaW5zdCBlYWNoIG90aGVyIGFuZCB0aGUgYmFzZSBjaGFyYWN0ZXIuCisg
ICAgICAgIFZlY3RvcjxHT0ZGU0VULCBVTklTQ1JJQkVfSEVMUEVSX1NUQUNLX0NIQVJTPiBtX29m
ZnNldHM7CisKKyAgICAgICAgLy8gRmlsbGVkIGJ5IGEgY2FsbCB0byBKdXN0aWZ5LCB0aGlzIGlz
IGVtcHR5IGZvciBub25qdXN0aWZpZWQgdGV4dC4KKyAgICAgICAgLy8gSWYgbm9uZW1wdHksIHRo
aXMgY29udGFpbnMgdGhlIGFycmF5IG9mIGp1c3RpZnkgY2hhcmFjdGVycyBmb3IgZWFjaAorICAg
ICAgICAvLyBjaGFyYWN0ZXIgYXMgcmV0dXJuZWQgYnkgU2NyaXB0SnVzdGlmeS4KKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYWR2YW5jZSBhcnJheSwgYnV0
IHdpdGggZXh0cmEgc3BhY2UgYWRkZWQKKyAgICAgICAgLy8gZm9yIHNvbWUgY2hhcmFjdGVycy4g
VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGdseXBoJ3MgfGp1c3RpZnl8CisgICAgICAgIC8vIHdp
ZHRoIGFuZCBpdCdzIHxhZHZhbmNlfCB3aWR0aCBpcyB0aGUgZXh0cmEgc3BhY2UgYWRkZWQuCisg
ICAgICAgIFZlY3RvcjxpbnQsIFVOSVNDUklCRV9IRUxQRVJfU1RBQ0tfQ0hBUlM+IG1fanVzdGlm
eTsKKworICAgICAgICAvLyBTaXppbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMgcnVuLiBUaGlzIHRy
ZWF0cyB0aGUgZW50aXJlIHJ1biBhcyBhCisgICAgICAgIC8vIGNoYXJhY3RlciB3aXRoIGEgcHJl
Y2VlZGluZyBhZHZhbmNlLCB3aWR0aCwgYW5kIGVuZGluZyBhZHZhbmNlLiAgVGhlCisgICAgICAg
IC8vIEIgd2lkdGggaXMgdGhlIHN1bSBvZiB0aGUgfGFkdmFuY2V8IGFycmF5LCBhbmQgdGhlIEEg
YW5kIEMgd2lkdGhzCisgICAgICAgIC8vIGFyZSBhbnkgZXh0cmEgc3BhY2luZyBhcHBsaWVkIHRv
IGVhY2ggZW5kLgorICAgICAgICAvLworICAgICAgICAvLyBJdCBpcyB1bmNsZWFyIGZyb20gdGhl
IGRvY3VtZW50YXRpb24gd2hhdCB0aGlzIGFjdHVhbGx5IG1lYW5zLiBGcm9tCisgICAgICAgIC8v
IGV4cGVyaW1lbnRhdGlvbiwgaXQgc2VlbXMgdGhhdCB0aGUgc3VtIG9mIHRoZSBjaGFyYWN0ZXIg
YWR2YW5jZXMgaXMKKyAgICAgICAgLy8gYWx3YXlzIHRoZSBzdW0gb2YgdGhlIEFCQyB2YWx1ZXMs
IGFuZCBJJ20gbm90IHN1cmUgd2hhdCB5b3UncmUKKyAgICAgICAgLy8gc3VwcG9zZWQgdG8gZG8g
d2l0aCB0aGUgQUJDIHZhbHVlcy4KKyAgICAgICAgQUJDIG1fYWJjOworCisgICAgICAgIC8vIFBv
aW50ZXJzIHRvIHdpbmRvd3MgZm9udCBkYXRhIHVzZWQgdG8gcmVuZGVyIHRoaXMgcnVuLgorICAg
ICAgICBIRk9OVCBtX2hmb250OworICAgICAgICBTQ1JJUFRfQ0FDSEUqIG1fc2NyaXB0Q2FjaGU7
CisKKyAgICAgICAgLy8gQXNjZW50IG9mZnNldCBiZXR3ZWVuIHRoZSBhc2NlbnQgb2YgdGhlIHBy
aW1hcnkgZm9udAorICAgICAgICAvLyBhbmQgdGhhdCBvZiB0aGUgZmFsbGJhY2sgZm9udC4gVGhl
IG9mZnNldCBuZWVkcyB0byBiZSBhcHBsaWVkLAorICAgICAgICAvLyB3aGVuIGRyYXdpbmcgYSBz
dHJpbmcsIHRvIGFsaWduIG11bHRpcGxlIHJ1bnMgcmVuZGVyZWQgd2l0aAorICAgICAgICAvLyBk
aWZmZXJlbnQgZm9udHMuCisgICAgICAgIGludCBtX2FzY2VudE9mZnNldDsKKyAgICB9OworCisg
ICAgLy8gQ29tcHV0ZXMgdGhlIHJ1bnNfIGFycmF5IGZyb20gdGhlIHRleHQgcnVuLgorICAgIHZv
aWQgZmlsbFJ1bnMoKTsKKworICAgIC8vIENvbXB1dGVzIHRoZSBzaGFwZXNfIGFycmF5IGdpdmVu
IGFuIHJ1bnNfIGFycmF5IGFscmVhZHkgZmlsbGVkIGluLgorICAgIHZvaWQgZmlsbFNoYXBlcygp
OworCisgICAgLy8gRmlsbHMgaW4gdGhlIHNjcmVlbl9vcmRlcl8gYXJyYXkgKHNlZSBiZWxvdyku
CisgICAgdm9pZCBmaWxsU2NyZWVuT3JkZXIoKTsKKworICAgIC8vIENhbGxlZCB0byB1cGRhdGUg
dGhlIGdseXBoIHBvc2l0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBzcGFjaW5nCisgICAgLy8g
b3B0aW9ucyB0aGF0IGFyZSBzZXQuCisgICAgdm9pZCBhcHBseVNwYWNpbmcoKTsKKworICAgIC8v
IE5vcm1hbGl6ZXMgYWxsIGFkdmFuY2VzIGZvciBzcGFjZXMgdG8gdGhlIHNhbWUgd2lkdGguIFRo
aXMga2VlcHMgd2luZG93cworICAgIC8vIGZyb20gbWFraW5nIHNwYWNlcyBhZnRlciBIaW5kaSBj
aGFyYWN0ZXJzIGxhcmdlciwgd2hpY2ggaXMgdGhlbgorICAgIC8vIGluY29uc2lzdGVudCB3aXRo
IG91ciBtZWF1cmUgb2YgdGhlIHdpZHRoIHNpbmNlIFdlYktpdCBkb2Vzbid0IGluY2x1ZGUKKyAg
ICAvLyBzcGFjZXMgaW4gdGV4dC1ydW5zIHNlbnQgdG8gdW5pc2NyaWJlIHVubGVzcyB3aGl0ZS1z
cGFjZTpwcmUuCisgICAgdm9pZCBhZGp1c3RTcGFjZUFkdmFuY2VzKCk7CisKKyAgICAvLyBSZXR1
cm5zIHRoZSB0b3RhbCB3aWR0aCBvZiBhIHNpbmdsZSBpdGVtLgorICAgIGludCBhZHZhbmNlRm9y
SXRlbShpbnQpIGNvbnN0OworCisgICAgLy8gU2hhcGVzIGEgcnVuIChwb2ludGVkIHRvIGJ5IHxp
bnB1dHwpIHVzaW5nIHxoZm9udHwgZmlyc3QuCisgICAgLy8gVHJpZXMgYSBzZXJpZXMgb2YgZm9u
dHMgc3BlY2lmaWVkIHJldHJpZXZlZCB3aXRoIE5leHRXaW5Gb250RGF0YQorICAgIC8vIGFuZCBm
aW5hbGx5IGEgZm9udCBjb3ZlcmluZyBjaGFyYWN0ZXJzIGluIHwqaW5wdXR8LiBBIHN0cmluZyBw
b2ludGVkCisgICAgLy8gYnkgfGlucHV0fCBjb21lcyBmcm9tIFNjcmlwdEl0ZW1pemUgYW5kIGlz
IHN1cHBvc2VkIHRvIGNvbnRhaW4KKyAgICAvLyBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byBhIHNp
bmdsZSBzY3JpcHQgYXNpZGUgZnJvbSBjaGFyYWN0ZXJzIGNvbW1vbiB0bworICAgIC8vIGFsbCBz
Y3JpcHRzIChlLmcuIHNwYWNlKS4KKyAgICBib29sIHNoYXBlKGNvbnN0IFVDaGFyKiBpbnB1dCwg
aW50IGl0ZW1MZW5ndGgsIGludCBudW1HbHlwaHMsIFNDUklQVF9JVEVNJiBydW4sIFNoYXBpbmcm
KTsKKworICAgIC8vIEdldHMgV2luZG93cyBmb250IGRhdGEgZm9yIHRoZSBuZXh0IGJlc3QgZm9u
dCB0byB0cnkgaW4gdGhlIGxpc3QKKyAgICAvLyBvZiBmb250cy4gV2hlbiB0aGVyZSdzIG5vIG1v
cmUgZm9udCBhdmFpbGFibGUsIHJldHVybnMgZmFsc2UKKyAgICAvLyB3aXRob3V0IHRvdWNoaW5n
IGFueSBvZiBvdXQgcGFyYW1zLiBOZWVkIHRvIGNhbGwgUmVzZXRGb250SW5kZXgKKyAgICAvLyB0
byBzdGFydCBzY2FubmluZyBvZiB0aGUgZm9udCBsaXN0IGZyb20gdGhlIGJlZ2lubmluZy4KKyAg
ICB2aXJ0dWFsIGJvb2wgbmV4dFdpbkZvbnREYXRhKEhGT05UKiwgU0NSSVBUX0NBQ0hFKiosIFND
UklQVF9GT05UUFJPUEVSVElFUyoqLCBpbnQqIGFzY2VudCkgeworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgLy8gUmVzZXRzIHRoZSBmb250IGluZGV4IHRvIHRoZSBmaXJzdCBp
biB0aGUgbGlzdCBvZiBmb250cyB0byB0cnkgYWZ0ZXIgdGhlCisgICAgLy8gcHJpbWFyeUZvbnQg
dHVybnMgb3V0IG5vdCB0byB3b3JrLiBXaXRoIGZvbnRJbmRleCByZXNldCwKKyAgICAvLyBOZXh0
V2luRm9udERhdGEgc2NhbnMgZmFsbGJhY2sgZm9udHMgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAg
IHZpcnR1YWwgdm9pZCByZXNldEZvbnRJbmRleCgpIHt9CisKKyAgICAvLyBUaGUgaW5wdXQgZGF0
YSBmb3IgdGhpcyBydW4gb2YgVW5pc2NyaWJlLiBTZWUgdGhlIGNvbnN0cnVjdG9yLgorICAgIGNv
bnN0IFVDaGFyKiBtX2lucHV0OworICAgIGNvbnN0IGludCBtX2lucHV0TGVuZ3RoOworICAgIGNv
bnN0IGJvb2wgbV9pc1J0bDsKKworICAgIC8vIFdpbmRvd3MgZm9udCBkYXRhIGZvciB0aGUgcHJp
bWFyeSBmb250LiBJbiBhIHNlbnNlLCBtX2xvZ2ZvbnQgYW5kIG1fc3R5bGUKKyAgICAvLyBhcmUg
cmVkdW5kYW50IGJlY2F1c2UgbV9oZm9udCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uLiBI
b3dldmVyLAorICAgIC8vIGludm9raW5nIEdldE9iamVjdCwgZXZlcnl0aW1lIHdlIG5lZWQgdGhl
IGhlaWdodCBhbmQgdGhlIHN0eWxlLCBpcyByYXRoZXIKKyAgICAvLyBleHBlbnNpdmUgc28gdGhh
dCB3ZSBjYWNoZSB0aGVtLiBXb3VsZCBpdCBiZSBiZXR0ZXIgdG8gYWRkIGdldHRlciBhbmQKKyAg
ICAvLyAodmlydHVhbCkgc2V0dGVyIGZvciB0aGUgaGVpZ2h0IGFuZCB0aGUgc3R5bGUgb2YgdGhl
IHByaW1hcnkgZm9udCwKKyAgICAvLyBpbnN0ZWFkIG9mIG1fbG9nZm9udD8gVGhlbiwgYSBkZXJp
dmVkIGNsYXNzIGN0b3IgY2FuIHNldCBtX2FzY2VudCwKKyAgICAvLyBtX2hlaWdodCBhbmQgbV9z
dHlsZSBpZiB0aGV5J3JlIGtub3duLiBHZXR0ZXJzIGZvciB0aGVtIHdvdWxkIGhhdmUgdG8KKyAg
ICAvLyAnaW5mZXInIHRoZWlyIHZhbHVlcyBmcm9tIG1faGZvbnQgT05MWSB3aGVuIHRoZXkncmUg
bm90IHNldC4KKyAgICBIRk9OVCBtX2hmb250OworICAgIFNDUklQVF9DQUNIRSogbV9zY3JpcHRD
YWNoZTsKKyAgICBTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIG1fZm9udFByb3BlcnRpZXM7CisgICAg
aW50IG1fYXNjZW50OworICAgIExPR0ZPTlQgbV9sb2dmb250OworICAgIGludCBtX3N0eWxlOwor
CisgICAgLy8gT3B0aW9ucywgc2VlIHRoZSBnZXR0ZXJzL3NldHRlcnMgYWJvdmUuCisgICAgYm9v
bCBtX2RpcmVjdGlvbmFsT3ZlcnJpZGU7CisgICAgYm9vbCBtX2luaGliaXRMaWdhdGU7CisgICAg
aW50IG1fbGV0dGVyU3BhY2luZzsKKyAgICBpbnQgbV9zcGFjZVdpZHRoOworICAgIGludCBtX3dv
cmRTcGFjaW5nOworCisgICAgLy8gVW5pc2NyaWJlIGJyZWFrcyB0aGUgdGV4dCBpbnRvIFJ1bnMu
IFRoZXNlIGFyZSBvbmUgbGVuZ3RoIG9mIHRleHQgdGhhdCBpcworICAgIC8vIGluIG9uZSBzY3Jp
cHQgYW5kIG9uZSBkaXJlY3Rpb24uIFRoaXMgYXJyYXkgaXMgaW4gcmVhZGluZyBvcmRlci4KKyAg
ICBWZWN0b3I8U0NSSVBUX0lURU0sIFVOSVNDUklCRV9IRUxQRVJfU1RBQ0tfUlVOUz4gbV9ydW5z
OworCisgICAgVmVjdG9yPFNoYXBpbmcsIFVOSVNDUklCRV9IRUxQRVJfU1RBQ0tfUlVOUz4gbV9z
aGFwZXM7CisKKyAgICAvLyBUaGlzIGlzIGEgbWFwcGluZyBiZXR3ZWVuIHJlYWRpbmcgb3JkZXIg
YW5kIHNjcmVlbiBvcmRlciBmb3IgdGhlIGl0ZW1zLgorICAgIC8vIFVuaXNjcmliZSdzIGl0ZW1z
IGFycmF5IGFyZSBpbiByZWFkaW5nIG9yZGVyLiBGb3IgcmlnaHQtdG8tbGVmdCB0ZXh0LAorICAg
IC8vIG9yIG1peGVkIChhbHRob3VnaCBXZWJLaXQncyB8VGV4dFJ1bnwgc2hvdWxkIHJlYWxseSBi
ZSBvbmx5IG9uZQorICAgIC8vIGRpcmVjdGlvbiksIHRoaXMgbWFrZXMgaXQgdmVyeSBkaWZmaWN1
bHQgdG8gY29tcHV0ZSBjaGFyYWN0ZXIgb2Zmc2V0cworICAgIC8vIGFuZCBwb3NpdGlvbnMuIFRo
aXMgbGlzdCBpcyBpbiBzY3JlZW4gb3JkZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBhbmQKKyAgICAv
LyBnaXZlcyB0aGUgaW5kZXggaW50byB0aGUgfG1fcnVuc3wgYW5kIHxtX3NoYXBlc3wgYXJyYXlz
IG9mIGVhY2gKKyAgICAvLyBzdWJzZXF1ZW50IGl0ZW0uCisgICAgVmVjdG9yPGludCwgVU5JU0NS
SUJFX0hFTFBFUl9TVEFDS19SVU5TPiBtX3NjcmVlbk9yZGVyOworfTsKKworfSAgLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBVbmlzY3JpYmVIZWxwZXJfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9VbmlzY3JpYmVIZWxwZXJUZXh0UnVu
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVW5pc2NyaWJlSGVscGVy
VGV4dFJ1bi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwMWMxMwot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVW5p
c2NyaWJlSGVscGVyVGV4dFJ1bi5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmln
aHQgKGMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICog
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlVuaXNjcmliZUhlbHBlclRleHRS
dW4uaCIKKworI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCisjaW5jbHVkZSAiRm9udC5oIgor
I2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworVW5p
c2NyaWJlSGVscGVyVGV4dFJ1bjo6VW5pc2NyaWJlSGVscGVyVGV4dFJ1bihjb25zdCBUZXh0UnVu
JiBydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEZvbnQmIGZvbnQpCisgICAgOiBVbmlzY3JpYmVIZWxwZXIocnVuLmNoYXJhY3RlcnMoKSwg
cnVuLmxlbmd0aCgpLCBydW4ucnRsKCksCisgICAgICAgICAgICAgICAgICAgICAgZm9udC5wcmlt
YXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5oZm9udCgpLAorICAgICAgICAgICAgICAgICAgICAg
IGZvbnQucHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2NyaXB0Q2FjaGUoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICBmb250LnByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNjcmlw
dEZvbnRQcm9wZXJ0aWVzKCkpCisgICAgLCBtX2ZvbnQoJmZvbnQpCisgICAgLCBtX2ZvbnRJbmRl
eCgwKQoreworICAgIHNldERpcmVjdGlvbmFsT3ZlcnJpZGUocnVuLmRpcmVjdGlvbmFsT3ZlcnJp
ZGUoKSk7CisgICAgc2V0TGV0dGVyU3BhY2luZyhmb250LmxldHRlclNwYWNpbmcoKSk7CisgICAg
c2V0U3BhY2VXaWR0aChmb250LnNwYWNlV2lkdGgoKSk7CisgICAgc2V0V29yZFNwYWNpbmcoZm9u
dC53b3JkU3BhY2luZygpKTsKKyAgICBzZXRBc2NlbnQoZm9udC5wcmltYXJ5Rm9udCgpLT5hc2Nl
bnQoKSk7CisKKyAgICBpbml0KCk7CisKKyAgICAvLyBQYWRkaW5nIGlzIHRoZSBhbW91bnQgdG8g
YWRkIHRvIG1ha2UganVzdGlmaWNhdGlvbiBoYXBwZW4uIFRoaXMKKyAgICAvLyBzaG91bGQgYmUg
ZG9uZSBhZnRlciBJbml0KCkgc28gYWxsIHRoZSBydW5zIGFyZSBhbHJlYWR5IG1lYXN1cmVkLgor
ICAgIGlmIChydW4ucGFkZGluZygpID4gMCkKKyAgICAgICAganVzdGlmeShydW4ucGFkZGluZygp
KTsKK30KKworVW5pc2NyaWJlSGVscGVyVGV4dFJ1bjo6VW5pc2NyaWJlSGVscGVyVGV4dFJ1bigK
KyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dCwKKyAgICBpbnQgaW5wdXRMZW5ndGgsCisgICAgYm9v
bCBpc1J0bCwKKyAgICBIRk9OVCBoZm9udCwKKyAgICBTQ1JJUFRfQ0FDSEUqIHNjcmlwdENhY2hl
LAorICAgIFNDUklQVF9GT05UUFJPUEVSVElFUyogZm9udFByb3BlcnRpZXMpCisgICAgOiBVbmlz
Y3JpYmVIZWxwZXIoaW5wdXQsIGlucHV0TGVuZ3RoLCBpc1J0bCwgaGZvbnQsCisgICAgICAgICAg
ICAgICAgICAgICAgc2NyaXB0Q2FjaGUsIGZvbnRQcm9wZXJ0aWVzKQorICAgICwgbV9mb250KDAp
CisgICAgLCBtX2ZvbnRJbmRleCgtMSkKK3sKK30KKwordm9pZCBVbmlzY3JpYmVIZWxwZXJUZXh0
UnVuOjp0cnlUb1ByZWxvYWRGb250KEhGT05UIGZvbnQpCit7CisgICAgLy8gQXNrIHRoZSBicm93
c2VyIHRvIGdldCB0aGUgZm9udCBtZXRyaWNzIGZvciB0aGlzIGZvbnQuCisgICAgLy8gVGhhdCB3
aWxsIHByZWxvYWQgdGhlIGZvbnQgYW5kIGl0IHNob3VsZCBub3cgYmUgYWNjZXNzaWJsZQorICAg
IC8vIGZyb20gdGhlIHJlbmRlcmVyLgorICAgIENocm9taXVtQnJpZGdlOjplbnN1cmVGb250TG9h
ZGVkKGZvbnQpOworfQorCitib29sIFVuaXNjcmliZUhlbHBlclRleHRSdW46Om5leHRXaW5Gb250
RGF0YSgKKyAgICBIRk9OVCogaGZvbnQsCisgICAgU0NSSVBUX0NBQ0hFKiogc2NyaXB0Q2FjaGUs
CisgICAgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiogZm9udFByb3BlcnRpZXMsCisgICAgaW50KiBh
c2NlbnQpCit7CisgICAgLy8gVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSBOZXh0V2lu
Rm9udERhdGEgY2FuIGJlIGNhbGxlZCBhZ2FpbgorICAgIC8vIGFmdGVyIHdlIGFscmVhZHkgcmFu
IG91dCBvZiBmb250cy4gZm9udERhdGFBdCBiZWhhdmVzIGluIGEgc3RyYW5nZQorICAgIC8vIG1h
bm5lciB3aGVuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcGFyYW0gcGFzc2VkIGFuZCAjIG9mIGZv
bnRzIHN0b3JlZCBpbgorICAgIC8vIFdlYktpdDo6Rm9udCBpcyBsYXJnZXIgdGhhbiBvbmUuIFdl
IGNhbiBhdm9pZCB0aGlzIGNoZWNrIGJ5IHNldHRpbmcKKyAgICAvLyBmb250X2luZGV4XyB0byAj
IG9mIGVsZW1lbnRzIGluIGhmb250c18gd2hlbiB3ZSBydW4gb3V0IG9mIGZvbnQuIEluIHRoYXQK
KyAgICAvLyBjYXNlLCB3ZSdkIGhhdmUgdG8gZ28gdGhyb3VnaCBhIGNvdXBsZSBvZiBtb3JlIGNo
ZWNrcyBiZWZvcmUgcmV0dXJuaW5nCisgICAgLy8gZmFsc2UuCisgICAgaWYgKG1fZm9udEluZGV4
ID09IC0xIHx8ICFtX2ZvbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRo
ZSBmb250IGRhdGEgZm9yIGEgZmFsbGJhY2sgZm9udCByZXF1ZXN0ZWQgaXMgbm90IHlldCByZXRy
aWV2ZWQsIGFkZAorICAgIC8vIHRoZW0gdG8gb3VyIHZlY3RvcnMuIE5vdGUgdGhhdCAnPicgcmF0
aGVyIHRoYW4gJz49JyBpcyB1c2VkIHRvIHRlc3QgdGhhdAorICAgIC8vIGNvbmRpdGlvbi4gcHJp
bWFyeUZvbnQgaXMgbm90IHN0b3JlZCBpbiBoZm9udHNfLCBhbmQgZnJpZW5kcyBzbyB0aGF0Cisg
ICAgLy8gaW5kaWNlcyBmb3IgZm9udERhdGFBdCBhbmQgb3VyIHZlY3RvcnMgZm9yIGZvbnQgZGF0
YSBhcmUgMSBvZmYgZnJvbSBlYWNoCisgICAgLy8gb3RoZXIuICBUaGF0IGlzLCB3aGVuIGZ1bGx5
IHBvcHVsYXRlZCwgaGZvbnRzXyBhbmQgZnJpZW5kcyBoYXZlIG9uZSBmb250CisgICAgLy8gZmV3
ZXIgdGhhbiB3aGF0J3MgY29udGFpbmVkIGluIGZvbnRfLgorICAgIGlmIChzdGF0aWNfY2FzdDxz
aXplX3Q+KCsrbV9mb250SW5kZXgpID4gbV9oZm9udHMuc2l6ZSgpKSB7CisgICAgICAgIGNvbnN0
IEZvbnREYXRhICpmb250RGF0YSA9IG1fZm9udC0+Zm9udERhdGFBdChtX2ZvbnRJbmRleCk7Cisg
ICAgICAgIGlmICghZm9udERhdGEpIHsKKyAgICAgICAgICAgIC8vIFJhbiBvdXQgb2YgZm9udHMu
CisgICAgICAgICAgICBtX2ZvbnRJbmRleCA9IC0xOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgd29uJ3Qgd29yayBmb3IgU2Vn
bWVudGVkRm9udERhdGEKKyAgICAgICAgLy8gaHR0cDovL2NyYnVnLmNvbS82NDI1CisgICAgICAg
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBzaW1wbGVGb250RGF0YSA9CisgICAgICAgICAgICBmb250
RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKTsKKworICAgICAgICBtX2hmb250cy5hcHBl
bmQoc2ltcGxlRm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLmhmb250KCkpOworICAgICAgICBtX3Nj
cmlwdENhY2hlcy5hcHBlbmQoc2ltcGxlRm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLnNjcmlwdENh
Y2hlKCkpOworICAgICAgICBtX2ZvbnRQcm9wZXJ0aWVzLmFwcGVuZChzaW1wbGVGb250RGF0YS0+
cGxhdGZvcm1EYXRhKCkuc2NyaXB0Rm9udFByb3BlcnRpZXMoKSk7CisgICAgICAgIG1fYXNjZW50
cy5hcHBlbmQoc2ltcGxlRm9udERhdGEtPmFzY2VudCgpKTsKKyAgICB9CisKKyAgICAqaGZvbnQg
PSBtX2hmb250c1ttX2ZvbnRJbmRleCAtIDFdOworICAgICpzY3JpcHRDYWNoZSA9IG1fc2NyaXB0
Q2FjaGVzW21fZm9udEluZGV4IC0gMV07CisgICAgKmZvbnRQcm9wZXJ0aWVzID0gbV9mb250UHJv
cGVydGllc1ttX2ZvbnRJbmRleCAtIDFdOworICAgICphc2NlbnQgPSBtX2FzY2VudHNbbV9mb250
SW5kZXggLSAxXTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBVbmlzY3JpYmVIZWxwZXJU
ZXh0UnVuOjpyZXNldEZvbnRJbmRleCgpCit7CisgICAgbV9mb250SW5kZXggPSAwOworfQorCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9VbmlzY3JpYmVIZWxwZXJUZXh0UnVuLmggYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1VuaXNjcmliZUhlbHBlclRleHRSdW4uaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM1NGEwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9VbmlzY3JpYmVIZWxwZXJUZXh0UnVuLmgKQEAg
LTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNywgMjAwOCwgMjAw
OSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFVuaXNjcmliZUhlbHBl
clRleHRSdW5faAorI2RlZmluZSBVbmlzY3JpYmVIZWxwZXJUZXh0UnVuX2gKKworI2luY2x1ZGUg
IlVuaXNjcmliZUhlbHBlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEZvbnQ7
CitjbGFzcyBUZXh0UnVuOworCisvLyBXcmFwcGVyIGFyb3VuZCB0aGUgVW5pc2NyaWJlIGhlbHBl
ciB0aGF0IGF1dG9tYXRpY2FsbHkgc2V0cyBpdCB1cCB3aXRoIHRoZQorLy8gV2ViS2l0IHR5cGVz
IHdlIHN1cHBseS4KK2NsYXNzIFVuaXNjcmliZUhlbHBlclRleHRSdW4gOiBwdWJsaWMgVW5pc2Ny
aWJlSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvLyBSZWd1bGFyIGNvbnN0cnVjdG9yIHVzZWQgZm9y
IFdlYkNvcmUgdGV4dCBydW4gcHJvY2Vzc2luZy4KKyAgICBVbmlzY3JpYmVIZWxwZXJUZXh0UnVu
KGNvbnN0IFRleHRSdW4mLCBjb25zdCBGb250Jik7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB3aXRo
IHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgZ2Z4OjpVbmlzY3JpYmVTdGF0ZS4gVXNpbmcKKyAg
ICAvLyB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgbm90IGdpdmUgeW91IGZvbnQgZmFsbGJhY2ssIGJ1
dCBpdCB3aWxsIHByb3ZpZGUKKyAgICAvLyB0aGUgYWJpbGl0eSB0byBsb2FkIGZvbnRzIHRoYXQg
bWF5IG5vdCBiZSBpbiB0aGUgT1MgY2FjaGUKKyAgICAvLyAoIlRyeVRvUHJlbG9hZEZvbnQiKSBp
ZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgYSBUZXh0UnVuL0ZvbnQuCisgICAgVW5pc2NyaWJl
SGVscGVyVGV4dFJ1bihjb25zdCB3Y2hhcl90KiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBpbnB1dExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wg
aXNSdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRk9OVCBoZm9udCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFNDUklQVF9DQUNIRSosCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBTQ1JJUFRfRk9OVFBST1BFUlRJRVMqKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwg
dm9pZCB0cnlUb1ByZWxvYWRGb250KEhGT05UKTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGZ1
bmN0aW9uIHJldHJpZXZlcyB0aGUgV2luZG93cyBmb250IGRhdGEgKEhGT05ULCBldGMpIGZvciB0
aGUgbmV4dAorICAgIC8vIFdlYktpdCBmb250IGluIHRoZSBsaXN0LiBJZiB0aGUgZm9udCBkYXRh
IGNvcnJlc3BvbmRpbmcgdG8gZm9udF9pbmRleF8KKyAgICAvLyBoYXMgYmVlbiBvYnRhaW5lZCBi
ZWZvcmUsIHJldHVybnMgdGhlIHZhbHVlcyBzdG9yZWQgaW4gb3VyIGludGVybmFsCisgICAgLy8g
dmVjdG9ycyAoaGZvbnRzXywgZXRjKS4gIE90aGVyd2lzZSwgaXQgZ2V0cyBuZXh0IFNpbXBsZUZv
bnREYXRhIGZyb20KKyAgICAvLyBXZWJLaXQgYW5kIGFkZHMgdGhlbSB0byBpbiBoZm9udHNfIGFu
ZCBmcmllbmRzIHNvIHRoYXQgZm9udCBkYXRhIGNhbiBiZQorICAgIC8vIHJldHVybmVkIHF1aWNr
bHkgbmV4dCB0aW1lIHRoZXkncmUgcmVxdWVzdGVkLgorICAgIHZpcnR1YWwgYm9vbCBuZXh0V2lu
Rm9udERhdGEoSEZPTlQqLCBTQ1JJUFRfQ0FDSEUqKiwgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKios
IGludCogYXNjZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRGb250SW5kZXgoKTsKKworICAg
IC8vIFJlZmVyZW5jZSB0byBXZWJLaXQ6OkZvbnQgdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm9y
bWF0aW9uIGFib3V0IGZvbnRzCisgICAgLy8gd2UgY2FuIHVzZSB0byByZW5kZXIgdGhpcyBpbnB1
dCBydW4gb2YgdGV4dC4gIEl0IGlzIHVzZWQgaW4KKyAgICAvLyBOZXh0V2luRm9udERhdGEgdG8g
cmV0cmlldmUgV2luZG93cyBmb250IGRhdGEgZm9yIGEgc2VyaWVzIG9mCisgICAgLy8gbm9uLXBy
aW1hcnkgZm9udHMuCisgICAgLy8KKyAgICAvLyBUaGlzIHBvaW50ZXIgY2FuIGJlIE5VTEwgZm9y
IG5vIGZvbnQgZmFsbGJhY2sgaGFuZGxpbmcuCisgICAgY29uc3QgRm9udCogbV9mb250OworCisg
ICAgLy8gSXQncyByYXJlIHRoYXQgbWFueSBmb250cyBhcmUgbGlzdGVkIGluIHN0eWxlc2hlZXRz
LgorICAgIC8vIEZvdXIgd291bGQgYmUgbGFyZ2UgZW5vdWdoIGluIG1vc3QgY2FzZXMuCisgICAg
Y29uc3Qgc3RhdGljIHNpemVfdCBrTnVtYmVyT2ZGb250cyA9IDQ7CisKKyAgICAvLyBUaGVzZSB2
ZWN0b3JzIGFyZSB1c2VkIHRvIHN0b3JlIFdpbmRvd3MgZm9udCBkYXRhIGZvciBub24tcHJpbWFy
eSBmb250cy4KKyAgICBWZWN0b3I8SEZPTlQsIGtOdW1iZXJPZkZvbnRzPiBtX2hmb250czsKKyAg
ICBWZWN0b3I8U0NSSVBUX0NBQ0hFKiwga051bWJlck9mRm9udHM+IG1fc2NyaXB0Q2FjaGVzOwor
ICAgIFZlY3RvcjxTQ1JJUFRfRk9OVFBST1BFUlRJRVMqLCBrTnVtYmVyT2ZGb250cz4gbV9mb250
UHJvcGVydGllczsKKyAgICBWZWN0b3I8aW50LCBrTnVtYmVyT2ZGb250cz4gbV9hc2NlbnRzOwor
CisgICAgLy8gSW5kZXggb2YgdGhlIGZhbGxiYWNrIGZvbnQgd2UncmUgY3VycmVudGx5IHVzaW5n
IGZvciBOZXh0V2luRm9udERhdGEuCisgICAgaW50IG1fZm9udEluZGV4OworfTsKKworfSAgLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBVbmlzY3JpYmVIZWxwZXJUZXh0UnVuX2gK
</data>
<flag name="review"
          id="12755"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>