<?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>101194</bug_id>
          
          <creation_ts>2012-11-05 01:54:47 -0800</creation_ts>
          <short_desc>Introduce Day class to calendar picker</short_desc>
          <delta_ts>2012-11-05 23:18:41 -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>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>100938</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Keishi Hattori">keishi</reporter>
          <assigned_to name="Keishi Hattori">keishi</assigned_to>
          <cc>tkent</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>758345</commentid>
    <comment_count>0</comment_count>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2012-11-05 01:54:47 -0800</bug_when>
    <thetext>Introduce Day class to calendar picker</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759108</commentid>
    <comment_count>1</comment_count>
      <attachid>172459</attachid>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2012-11-05 17:59:30 -0800</bug_when>
    <thetext>Created attachment 172459
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759192</commentid>
    <comment_count>2</comment_count>
      <attachid>172459</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-11-05 19:57:01 -0800</bug_when>
    <thetext>Comment on attachment 172459
Patch

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

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:242
&gt; +Day.createFromToday = function() {
&gt; +    return Day.createFromDate(new Date());

I think this doesn&apos;t work as expected during 00:00 - 09:00 in Japan Standard Time.
For example, &quot;new Date()&quot; has 2012-11-06T07:00 in the local time, but getUTCDate() returns 5.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:268
&gt; + * @return {!Day}

!Day -&gt; !Date

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:507
&gt; +    this._minimumValue = (typeof this._config.min !== &quot;undefined&quot;) ? parseDateString(this._config.min).valueOf() : Day.Minimum;

Type mismatch. parseDateString().valueOf() is a number and Day.Minimum is a Date.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:620
&gt; +CalendarPicker.prototype.shouldShowMonth = function(month) {

Please add jsdoc annotation.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:624
&gt; +CalendarPicker.prototype.showMonth = function(month, animate, keepSelectionPosition) {

ditto.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:636
&gt; +CalendarPicker.prototype.currentMonth = function() {

ditto.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:771
&gt; -        this._left3.disabled = current - 13 &lt; min;
&gt; -    this._left2.disabled = current - 2 &lt; min;
&gt; -    this._left1.disabled = current - 1 &lt; min;
&gt; -    this._right1.disabled = current + 1 &gt; max;
&gt; -    this._right2.disabled = current + 2 &gt; max;
&gt; +        this._left3.disabled = !this.picker.shouldShowMonth(new Month(monthValue - 121));
&gt; +    this._left2.disabled = !this.picker.shouldShowMonth(new Month(monthValue - 12));
&gt; +    this._left1.disabled = !this.picker.shouldShowMonth(new Month(monthValue - 1));
&gt; +    this._right1.disabled = !this.picker.shouldShowMonth(new Month(monthValue + 1));
&gt; +    this._right2.disabled = !this.picker.shouldShowMonth(new Month(monthValue + 12));
&gt;      if (this._right3)
&gt; -        this._right3.disabled = current + 13 &gt; max;
&gt; -    this._month.innerText = this._currentMonth.toLocaleString();
&gt; +        this._left3.disabled = !this.picker.shouldShowMonth(new Month(monthValue + 121));

This changes behavior.  Is it intentional?
The current code intention is that _left2 button moves to min(minimum-month, current-month - 12) and should be disabled if _left2 would have same behavior with _left1.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1047
&gt;   * @param {!number} time date in millisecond.
&gt;   * @return {!boolean}
&gt;   */
&gt; -CalendarPicker.prototype.isValidDate = function(time) {
&gt; -    return !this.outOfRange(time) &amp;&amp; !this.stepMismatch(time);
&gt; +CalendarPicker.prototype.isValidDate = function(range) {
&gt; +    var value = range.valueOf();

Please update the annotation.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1056
&gt;   * @param {!number} month
&gt;   */
&gt;  DaysTable.prototype._renderMonth = function(month) {
&gt; -    this._currentMonth = new Month(month);
&gt; -    var dayIterator = this._currentMonth.startDate();
&gt; +    var dayIterator = month.startDate();

Ditto.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1091
&gt; +DaysTable.prototype.navigateToMonth = function(month, animate, keepSelectionPosition) {

ditto.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1174
&gt; -    this._navigateToMonthWithAnimation(currentMonth.previous());
&gt; +    this.picker.showMonth(previousMonth);

The original code is &quot;WithAnimation&quot; but the new code has no &quot;animation&quot; flag.

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1185
&gt; -    this._navigateToMonthWithAnimation(currentMonth.next());
&gt; +    this.picker.showMonth(nextMonth);

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759213</commentid>
    <comment_count>3</comment_count>
      <attachid>172480</attachid>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2012-11-05 21:01:13 -0800</bug_when>
    <thetext>Created attachment 172480
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759214</commentid>
    <comment_count>4</comment_count>
      <attachid>172459</attachid>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2012-11-05 21:01:32 -0800</bug_when>
    <thetext>Comment on attachment 172459
Patch

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

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:242
&gt;&gt; +    return Day.createFromDate(new Date());
&gt; 
&gt; I think this doesn&apos;t work as expected during 00:00 - 09:00 in Japan Standard Time.
&gt; For example, &quot;new Date()&quot; has 2012-11-06T07:00 in the local time, but getUTCDate() returns 5.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:268
&gt;&gt; + * @return {!Day}
&gt; 
&gt; !Day -&gt; !Date

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:507
&gt;&gt; +    this._minimumValue = (typeof this._config.min !== &quot;undefined&quot;) ? parseDateString(this._config.min).valueOf() : Day.Minimum;
&gt; 
&gt; Type mismatch. parseDateString().valueOf() is a number and Day.Minimum is a Date.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:620
&gt;&gt; +CalendarPicker.prototype.shouldShowMonth = function(month) {
&gt; 
&gt; Please add jsdoc annotation.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:624
&gt;&gt; +CalendarPicker.prototype.showMonth = function(month, animate, keepSelectionPosition) {
&gt; 
&gt; ditto.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:636
&gt;&gt; +CalendarPicker.prototype.currentMonth = function() {
&gt; 
&gt; ditto.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:771
&gt;&gt; +        this._left3.disabled = !this.picker.shouldShowMonth(new Month(monthValue + 121));
&gt; 
&gt; This changes behavior.  Is it intentional?
&gt; The current code intention is that _left2 button moves to min(minimum-month, current-month - 12) and should be disabled if _left2 would have same behavior with _left1.

I didn&apos;t realize. Reverting the behavior.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1047
&gt;&gt; +    var value = range.valueOf();
&gt; 
&gt; Please update the annotation.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1056
&gt;&gt; +    var dayIterator = month.startDate();
&gt; 
&gt; Ditto.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1091
&gt;&gt; +DaysTable.prototype.navigateToMonth = function(month, animate, keepSelectionPosition) {
&gt; 
&gt; ditto.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1174
&gt;&gt; +    this.picker.showMonth(previousMonth);
&gt; 
&gt; The original code is &quot;WithAnimation&quot; but the new code has no &quot;animation&quot; flag.

Done.

&gt;&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:1185
&gt;&gt; +    this.picker.showMonth(nextMonth);
&gt; 
&gt; Ditto.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759221</commentid>
    <comment_count>5</comment_count>
      <attachid>172480</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-11-05 21:13:43 -0800</bug_when>
    <thetext>Comment on attachment 172480
Patch

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

&gt; Source/WebCore/Resources/pagepopups/calendarPicker.js:632
&gt; + * @param {!bool} animate
&gt; + * @param {!bool} keepSelectionPosition

Some callsites omit these bool arguments.  They should be {bool=}.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759225</commentid>
    <comment_count>6</comment_count>
      <attachid>172482</attachid>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2012-11-05 21:17:27 -0800</bug_when>
    <thetext>Created attachment 172482
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759294</commentid>
    <comment_count>7</comment_count>
      <attachid>172482</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-05 23:18:38 -0800</bug_when>
    <thetext>Comment on attachment 172482
Patch

Clearing flags on attachment: 172482

Committed r133565: &lt;http://trac.webkit.org/changeset/133565&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759295</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-05 23:18:41 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172459</attachid>
            <date>2012-11-05 17:59:30 -0800</date>
            <delta_ts>2012-11-05 21:16:10 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101194-20121106105744.patch</filename>
            <type>text/plain</type>
            <size>27026</size>
            <attacher name="Keishi Hattori">keishi</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzNDM0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDlkNTkwZTAyZTdmOTMw
NzljOWZmMmFhMzYzMDdkNzNmNDkyZWI4NC4uMjRmMmIyNzU1NGU2ZmM5YmM2Mzk2MTYxZTNkZWNm
YWIxZmQyZDFlNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDEyLTExLTA1ICBLZWlz
aGkgSGF0dG9yaSAgPGtlaXNoaUB3ZWJraXQub3JnPgorCisgICAgICAgIEludHJvZHVjZSBEYXkg
Y2xhc3MgdG8gY2FsZW5kYXIgcGlja2VyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMDExOTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbnRyb2R1Y2luZyBEYXkgY2xhc3Mgc28gZGF5LCB3ZWVrLCBhbmQg
bW9udGggY2FuIGFsbCBiZSBhYnN0cmFjdGVkLiBUbworICAgICAgICBzb2x2ZSBzb21lIG9mIHRo
ZSBjb21wbGV4aXR5IGFyb3VuZCB3aGljaCBtb250aHMgdG8gc2hvdywgSSBtYWRlCisgICAgICAg
IENhbGVuZGFyUGlja2VyIGluIGNoYXJnZSBvZiBpdC4gVGhpcyBhbHNvIG1hZGUgWWVhck1vbnRo
Q29udHJvbGxlciBhbmQKKyAgICAgICAgRGF5c1RhYmxlIGluZGVwZW5kZW50IG9mIGVhY2ggb3Ro
ZXIuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiBDb3ZlcmVkIGJ5IGV4aXN0aW5nIGNhbGVuZGFy
LXBpY2tlci0qLmh0bWwgdGVzdHMuCisKKyAgICAgICAgKiBSZXNvdXJjZXMvcGFnZXBvcHVwcy9j
YWxlbmRhclBpY2tlci5qczoKKyAgICAgICAgKGNyZWF0ZVVUQ0RhdGUpOiBBbGxvdyBuZWdhdGl2
ZSBtb250aCBvciBkYXRlLgorICAgICAgICAocGFyc2VEYXRlU3RyaW5nKTogV2lsbCByZXR1cm4g
RGF5IG9yIE1vbnRoIGRlcGVuZGluZyBvbiBzdHJpbmcgZm9ybWF0LgorICAgICAgICAoRGF5KTog
UmVwcmVzZW50cyBhIGRheS4KKyAgICAgICAgKERheS5wYXJzZSk6IFBhcnNlIHl5eXktbW0tZGQu
CisgICAgICAgIChEYXkuY3JlYXRlRnJvbURhdGUpOiBDcmVhdGVzIGEgRGF5IHRoYXQgY29udGFp
bnMgYSBkYXRldGltZS4KKyAgICAgICAgKERheS5jcmVhdGVGcm9tVG9kYXkpOiBDcmVhdGVzIERh
eSBmb3IgdG9kYXkuIEEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIHRv
IFdlZWsgYW5kIE1vbnRoIGluIHRoZSBmdXR1cmUuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVx
dWFscyk6IFJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KKyAgICAgICAgKERheS5w
cm90b3R5cGUucHJldmlvdXMpOiBSZXR1cm5zIHRoZSBwcmV2aW91cyBkYXkuCisgICAgICAgIChE
YXkucHJvdG90eXBlLm5leHQpOiBSZXR1cm5zIHRoZSBuZXh0IGRheS4KKyAgICAgICAgKERheS5w
cm90b3R5cGUuc3RhcnREYXRlKTogUmV0dXJucyB0aGUgZGF0ZXRpbWUgdGhhdCBpcyB0aGUgc3Rh
cnQgb2YgdGhpcyBkYXkuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVuZERhdGUpOiBSZXR1cm5z
IHRoZSBkYXRldGltZSB0aGF0IGlzIHRoZSBzdGFydCBvZiB0aGlzIGRheS4KKyAgICAgICAgKERh
eS5wcm90b3R5cGUudmFsdWVPZik6IFJldHVybnMgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9j
aC4KKyAgICAgICAgKERheS5wcm90b3R5cGUudG9TdHJpbmcpOiBSZXR1cm5zIGFuIElTTyBkYXRl
IHN0cmluZy4KKyAgICAgICAgKE1vbnRoKTogRml4IGJ1ZyBpbiBjYWxjdWxhdGluZyBtb250aCBm
cm9tIHZhbHVlLgorICAgICAgICAoTW9udGgucHJvdG90eXBlLmVuZERhdGUpOiBVc2UgRGF5Lk1h
eGltdW0uCisgICAgICAgIChDYWxlbmRhclBpY2tlcik6IEFkZGVkIF9jdXJyZW50TW9udGguIHll
YXJNb250aENvbnRyb2xsZXIgYW5kIGRheXNUYWJsZSBjYW4gYmUgcHJpdmF0ZSBtZW1iZXJzIG5v
dy4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0KToKKyAgICAgICAg
KENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5oYW5kbGVUb2RheSk6IFVzZSBEYXkuY3JlYXRlRnJv
bVRvZGF5LgorICAgICAgICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3VsZFNob3dNb250
aCk6IFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9udGggc2hvdWxkIGJlIHNob3duLgorICAgICAgICAo
Q2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3dNb250aCk6IFNob3dzIHRoZSBnaXZlbiBtb250
aC4gSWYgdGhlIG1vbnRoIGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgbW9udGhzIHRoYXQgc2hvdWxk
IGJlIHNob3duLCB3ZSBjbGFtcCB0aGUgbW9udGggYW5kIHNob3cgdGhhdC4KKyAgICAgICAgKENh
bGVuZGFyUGlja2VyLnByb3RvdHlwZS5jdXJyZW50TW9udGgpOiBSZXR1cm5zIHRoZSBjdXJyZW50
IG1vbnRoIHRoYXQgaXMgc2hvd24uCisgICAgICAgIChZZWFyTW9udGhDb250cm9sbGVyKTogUmVt
b3ZlZCBfY3VycmVudE1vbnRoLgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5
cGUuYXR0YWNoVG8pOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuc2V0
TW9udGgpOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX2hhbmRsZVll
YXJNb250aENoYW5nZSk6IFVzZSBDYWxlbmRhclBpY2tlci5zaG93TW9udGgKKyAgICAgICAgKFll
YXJNb250aENvbnRyb2xsZXIucHJvdG90eXBlLm1vdmVSZWxhdGl2ZWx5KToKKyAgICAgICAgKERh
eXNUYWJsZSk6CisgICAgICAgIChDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX3N0ZXBNaXNtYXRj
aCk6IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fb3V0
T2ZSYW5nZSk6IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlw
ZS5pc1ZhbGlkRGF0ZSk6IFRha2UgRGF5IG9yIE1vbnRoIGluc3RlYWQgb2YgbWlsbGlzZWNvbmRz
IHNpbmNlIGVwb2NoLgorICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGgp
OgorICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5uYXZpZ2F0ZVRvTW9udGgpOiBTaG93cyBh
IGdpdmVuIG1vbnRoLiBDYW4gdXNlIGFuaW1hdGlvbiBhbmQgbGVhdmUgdGhlIHNlbGVjdGlvbiBw
b3NpdGlvbiBhcyBpcy4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuc2VsZWN0UmFuZ2Up
OiBTZWxlY3QgYSByYW5nZS4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuX21heWJlU2V0
UHJldmlvdXNNb250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9tYXliZVNldE5l
eHRNb250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9oYW5kbGVLZXkpOgorICAg
ICAgICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9oYW5kbGVCb2R5S2V5RG93bik6CisKIDIw
MTItMTEtMDQgIEtlaXNoaSBIYXR0b3JpICA8a2Vpc2hpQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
SW50cm9kdWNlIE1vbnRoIGNsYXNzIHRvIGNhbGVuZGFyIHBpY2tlcgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvUmVzb3VyY2VzL3BhZ2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuanMgYi9Tb3Vy
Y2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcwppbmRleCA2
NTYxNDZkMDA3MGVlN2YwOTliN2U0ZTdlNjI2OTg0ZDgwMDVkY2VmLi42MTY2YmViYjc2MjVhNDg5
OTJlMjA2MGFjNjhiNGUxMDliOTUxYmRmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9SZXNv
dXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcworKysgYi9Tb3VyY2UvV2ViQ29yZS9S
ZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcwpAQCAtMTc1LDM5ICsxNzUsMTI1
IEBAIE1vbnRoLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uKCkgewogfTsKIAog
ZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewotICAgIHZhciBuZXdE
YXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRhdGUpKTsKLSAgICBpZiAoeWVh
ciA8IDEwMCkKLSAgICAgICAgbmV3RGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyKTsKKyAgICB2YXIg
bmV3RGF0ZSA9IG5ldyBEYXRlKDApOworICAgIG5ld0RhdGUuc2V0VVRDRnVsbFllYXIoeWVhcik7
CisgICAgbmV3RGF0ZS5zZXRVVENNb250aChtb250aCk7CisgICAgbmV3RGF0ZS5zZXRVVENEYXRl
KGRhdGUpOwogICAgIHJldHVybiBuZXdEYXRlOwogfTsKIAogLyoqCi0gKiBAcGFyYW0ge3N0cmlu
Zz19IG9wdF9jdXJyZW50Ci0gKiBAcmV0dXJuIHshRGF0ZX0KKyAqIEBwYXJhbSB7c3RyaW5nfSBk
YXRlU3RyaW5nCisgKiBAcmV0dXJuIHs/RGF5fE1vbnRofQorICovCitmdW5jdGlvbiBwYXJzZURh
dGVTdHJpbmcoZGF0ZVN0cmluZykgeworICAgIHZhciBtb250aCA9IE1vbnRoLnBhcnNlKGRhdGVT
dHJpbmcpOworICAgIGlmIChtb250aCkKKyAgICAgICAgcmV0dXJuIG1vbnRoOworICAgIHJldHVy
biBEYXkucGFyc2UoZGF0ZVN0cmluZyk7Cit9CisKKy8qKgorICogQHBhcmFtIHshbnVtYmVyfERh
eX0gdmFsdWVPckRheU9yWWVhcgorICogQHBhcmFtIHshbnVtYmVyPX0gbW9udGgKKyAqIEBwYXJh
bSB7IW51bWJlcj19IGRhdGUKKyAqLworZnVuY3Rpb24gRGF5KHZhbHVlT3JEYXlPclllYXIsIG1v
bnRoLCBkYXRlKSB7CisgICAgdmFyIGRhdGVPYmplY3Q7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPT0gMykKKyAgICAgICAgZGF0ZU9iamVjdCA9IGNyZWF0ZVVUQ0RhdGUodmFsdWVPckRheU9y
WWVhciwgbW9udGgsIGRhdGUpOworICAgIGVsc2UgaWYgKHZhbHVlT3JEYXlPclllYXIgaW5zdGFu
Y2VvZiBEYXkpCisgICAgICAgIGRhdGVPYmplY3QgPSBjcmVhdGVVVENEYXRlKHZhbHVlT3JEYXlP
clllYXIueWVhciwgdmFsdWVPckRheU9yWWVhci5tb250aCwgdmFsdWVPckRheU9yWWVhci5kYXRl
KTsKKyAgICBlbHNlCisgICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZU9yRGF5T3JZ
ZWFyKTsKKyAgICB0aGlzLnllYXIgPSBkYXRlT2JqZWN0LmdldFVUQ0Z1bGxZZWFyKCk7ICAgIAor
ICAgIHRoaXMubW9udGggPSBkYXRlT2JqZWN0LmdldFVUQ01vbnRoKCk7CisgICAgdGhpcy5kYXRl
ID0gZGF0ZU9iamVjdC5nZXRVVENEYXRlKCk7Cit9OworCitEYXkuSVNPU3RyaW5nUmVnRXhwID0g
L14oXGQrKS0oXGQrKS0oXGQrKSQvOworCisvLyBTZWUgV2ViQ29yZS9wbGF0Zm9ybS9EYXRlQ29t
cG9uZW50cy5oLgorRGF5Lk1pbmltdW0gPSBuZXcgRGF0ZSgtNjIxMzU1OTY4MDAwMDAuMCk7CitE
YXkuTWF4aW11bSA9IG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDAuMCk7CisKKy8qKgorICogQHBh
cmFtIHshc3RyaW5nfSBzdHIKKyAqIEByZXR1cm4gez9Nb250aH0KICAqLwotZnVuY3Rpb24gcGFy
c2VEYXRlU3RyaW5nKG9wdF9jdXJyZW50KSB7Ci0gICAgaWYgKG9wdF9jdXJyZW50KSB7Ci0gICAg
ICAgIHZhciByZXN1bHQgPSBvcHRfY3VycmVudC5tYXRjaCgvKFxkKyktKFxkKyktKFxkKykvKTsK
LSAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVVVENEYXRlKE51
bWJlcihyZXN1bHRbMV0pLCBOdW1iZXIocmVzdWx0WzJdKSAtIDEsIE51bWJlcihyZXN1bHRbM10p
KTsKLSAgICB9Ci0gICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7Ci0gICAgLy8gQ3JlYXRlIFVUQyBk
YXRlIHdpdGggc2FtZSBudW1iZXJzIGFzIGxvY2FsIGRhdGUuCi0gICAgcmV0dXJuIGNyZWF0ZVVU
Q0RhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpKTsK
K0RheS5wYXJzZSA9IGZ1bmN0aW9uKHN0cikgeworICAgIHZhciBtYXRjaCA9IERheS5JU09TdHJp
bmdSZWdFeHAuZXhlYyhzdHIpOworICAgIGlmICghbWF0Y2gpCisgICAgICAgIHJldHVybiBudWxs
OworICAgIHZhciB5ZWFyID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTsKKyAgICB2YXIgbW9udGgg
PSBwYXJzZUludChtYXRjaFsyXSwgMTApIC0gMTsKKyAgICB2YXIgZGF0ZSA9IHBhcnNlSW50KG1h
dGNoWzNdLCAxMCk7CisgICAgcmV0dXJuIG5ldyBEYXkoeWVhciwgbW9udGgsIGRhdGUpOworfTsK
Ky8qKgorICogQHBhcmFtIHshRGF0ZX0gZGF0ZQorICogQHJldHVybiB7IU1vbnRofQorICovCitE
YXkuY3JlYXRlRnJvbURhdGUgPSBmdW5jdGlvbihkYXRlKSB7CisgICAgcmV0dXJuIG5ldyBEYXko
ZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRlLmdldFVUQ01vbnRoKCksIGRhdGUuZ2V0VVRDRGF0
ZSgpKTsKK307CisKK0RheS5jcmVhdGVGcm9tVG9kYXkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gRGF5LmNyZWF0ZUZyb21EYXRlKG5ldyBEYXRlKCkpOwogfQogCiAvKioKLSAqIEBwYXJhbSB7
IW51bWJlcn0geWVhcgotICogQHBhcmFtIHshbnVtYmVyfSBtb250aAotICogQHBhcmFtIHshbnVt
YmVyfSBkYXkKKyAqIEBwYXJhbSB7IURheX0gb3RoZXIKKyAqIEByZXR1cm4geyFib29sfQorICov
CitEYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7CisgICAgcmV0dXJuIHRo
aXMueWVhciA9PT0gb3RoZXIueWVhciAmJiB0aGlzLm1vbnRoID09PSBvdGhlci5tb250aCAmJiB0
aGlzLmRhdGUgPT09IG90aGVyLmRhdGU7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFEYXl9Cisg
Ki8KK0RheS5wcm90b3R5cGUucHJldmlvdXMgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gbmV3
IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSAtIDEpOworfTsKKworLyoqCisg
KiBAcmV0dXJuIHshRGF5fQorICovCitEYXkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gbmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSArIDEp
OworfTsKKworLyoqCisgKiBAcmV0dXJuIHshRGF5fQorICovCitEYXkucHJvdG90eXBlLnN0YXJ0
RGF0ZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBjcmVhdGVVVENEYXRlKHRoaXMueWVhciwg
dGhpcy5tb250aCwgdGhpcy5kYXRlKTsKK307CisKKy8qKgorICogQHJldHVybiB7IURhdGV9Cisg
Ki8KK0RheS5wcm90b3R5cGUuZW5kRGF0ZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBjcmVh
dGVVVENEYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXRlICsgMSk7Cit9OworCisv
KioKKyAqIEByZXR1cm4geyFudW1iZXJ9CisgKi8KK0RheS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1
bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSgpLmdldFRpbWUoKTsKK307CisK
Ky8qKgogICogQHJldHVybiB7IXN0cmluZ30KICAqLwotZnVuY3Rpb24gc2VyaWFsaXplRGF0ZSh5
ZWFyLCBtb250aCwgZGF5KSB7Ci0gICAgdmFyIHllYXJTdHJpbmcgPSBTdHJpbmcoeWVhcik7CitE
YXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHllYXJTdHJpbmcg
PSBTdHJpbmcodGhpcy55ZWFyKTsKICAgICBpZiAoeWVhclN0cmluZy5sZW5ndGggPCA0KQogICAg
ICAgICB5ZWFyU3RyaW5nID0gKCIwMDAiICsgeWVhclN0cmluZykuc3Vic3RyKC00LCA0KTsKLSAg
ICByZXR1cm4geWVhclN0cmluZyArICItIiArICgiMCIgKyAobW9udGggKyAxKSkuc3Vic3RyKC0y
LCAyKSArICItIiArICgiMCIgKyBkYXkpLnN1YnN0cigtMiwgMik7Ci19CisgICAgcmV0dXJuIHll
YXJTdHJpbmcgKyAiLSIgKyAoIjAiICsgKHRoaXMubW9udGggKyAxKSkuc3Vic3RyKC0yLCAyKSAr
ICItIiArICgiMCIgKyB0aGlzLmRhdGUpLnN1YnN0cigtMiwgMik7Cit9OwogCiAvKioKICAqIEBw
YXJhbSB7IW51bWJlcnxNb250aH0gdmFsdWVPck1vbnRoT3JZZWFyCkBAIC0yMjEsMTIgKzMwNywx
MiBAQCBmdW5jdGlvbiBNb250aCh2YWx1ZU9yTW9udGhPclllYXIsIG1vbnRoKSB7CiAgICAgICAg
IHRoaXMueWVhciA9IHZhbHVlT3JNb250aE9yWWVhci55ZWFyOwogICAgICAgICB0aGlzLm1vbnRo
ID0gdmFsdWVPck1vbnRoT3JZZWFyLm1vbnRoOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMu
eWVhciA9IE1hdGguZmxvb3IodmFsdWVPck1vbnRoT3JZZWFyIC8gMTIpICsgMTk3MDsKLSAgICAg
ICAgdGhpcy5tb250aCA9IHZhbHVlT3JNb250aE9yWWVhciAlIDEyOworICAgICAgICB0aGlzLnll
YXIgPSAxOTcwOworICAgICAgICB0aGlzLm1vbnRoID0gdmFsdWVPck1vbnRoT3JZZWFyOwogICAg
IH0KICAgICB0aGlzLnllYXIgPSB0aGlzLnllYXIgKyBNYXRoLmZsb29yKHRoaXMubW9udGggLyAx
Mik7CiAgICAgdGhpcy5tb250aCA9IHRoaXMubW9udGggPCAwID8gdGhpcy5tb250aCAlIDEyICsg
MTIgOiB0aGlzLm1vbnRoICUgMTI7Ci0gICAgaWYgKHRoaXMueWVhciA8IDAgfHwgTW9udGguTWF4
aW11bSA8IHRoaXMpIHsKKyAgICBpZiAodGhpcy55ZWFyIDw9IDAgfHwgTW9udGguTWF4aW11bSA8
IHRoaXMpIHsKICAgICAgICAgdGhpcy55ZWFyID0gTmFOOwogICAgICAgICB0aGlzLm1vbnRoID0g
TmFOOwogICAgIH0KQEAgLTI5Miw3ICszNzgsNyBAQCBNb250aC5wcm90b3R5cGUuc3RhcnREYXRl
ID0gZnVuY3Rpb24oKSB7CiAgKi8KIE1vbnRoLnByb3RvdHlwZS5lbmREYXRlID0gZnVuY3Rpb24o
KSB7CiAgICAgaWYgKHRoaXMuZXF1YWxzKE1vbnRoLk1heGltdW0pKQotICAgICAgICByZXR1cm4g
Q2FsZW5kYXJQaWNrZXIuTWF4aW11bVBvc3NpYmxlRGF0ZTsKKyAgICAgICAgcmV0dXJuIERheS5N
YXhpbXVtLnN0YXJ0RGF0ZSgpOwogICAgIHJldHVybiB0aGlzLm5leHQoKS5zdGFydERhdGUoKTsK
IH07CiAKQEAgLTQxOCwzMCArNTA0LDMzIEBAIGZ1bmN0aW9uIENhbGVuZGFyUGlja2VyKGVsZW1l
bnQsIGNvbmZpZykgewogICAgIHRoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZUJvdW5kID0gdGhpcy5f
aGFuZGxlV2luZG93UmVzaXplLmJpbmQodGhpcyk7CiAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVu
ZXIoInJlc2l6ZSIsIHRoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZUJvdW5kLCBmYWxzZSk7CiAgICAg
Ly8gV2UgYXNzdW1lIHRoaXMuX2NvbmZpZy5taW4gaXMgYSB2YWxpZCBkYXRlLgotICAgIHRoaXMu
bWluaW11bURhdGUgPSAodHlwZW9mIHRoaXMuX2NvbmZpZy5taW4gIT09ICJ1bmRlZmluZWQiKSA/
IHBhcnNlRGF0ZVN0cmluZyh0aGlzLl9jb25maWcubWluKSA6IENhbGVuZGFyUGlja2VyLk1pbmlt
dW1Qb3NzaWJsZURhdGU7CisgICAgdGhpcy5fbWluaW11bVZhbHVlID0gKHR5cGVvZiB0aGlzLl9j
b25maWcubWluICE9PSAidW5kZWZpbmVkIikgPyBwYXJzZURhdGVTdHJpbmcodGhpcy5fY29uZmln
Lm1pbikudmFsdWVPZigpIDogRGF5Lk1pbmltdW07CiAgICAgLy8gV2UgYXNzdW1lIHRoaXMuX2Nv
bmZpZy5tYXggaXMgYSB2YWxpZCBkYXRlLgotICAgIHRoaXMubWF4aW11bURhdGUgPSAodHlwZW9m
IHRoaXMuX2NvbmZpZy5tYXggIT09ICJ1bmRlZmluZWQiKSA/IHBhcnNlRGF0ZVN0cmluZyh0aGlz
Ll9jb25maWcubWF4KSA6IENhbGVuZGFyUGlja2VyLk1heGltdW1Qb3NzaWJsZURhdGU7CisgICAg
dGhpcy5fbWF4aW11bVZhbHVlID0gKHR5cGVvZiB0aGlzLl9jb25maWcubWF4ICE9PSAidW5kZWZp
bmVkIikgPyBwYXJzZURhdGVTdHJpbmcodGhpcy5fY29uZmlnLm1heCkudmFsdWVPZigpIDogRGF5
Lk1heGltdW07CiAgICAgdGhpcy5zdGVwID0gKHR5cGVvZiB0aGlzLl9jb25maWcuc3RlcCAhPT0g
dW5kZWZpbmVkKSA/IE51bWJlcih0aGlzLl9jb25maWcuc3RlcCkgOiBDYWxlbmRhclBpY2tlci5E
ZWZhdWx0U3RlcFNjYWxlRmFjdG9yOwogICAgIHRoaXMuc3RlcEJhc2UgPSAodHlwZW9mIHRoaXMu
X2NvbmZpZy5zdGVwQmFzZSAhPT0gInVuZGVmaW5lZCIpID8gTnVtYmVyKHRoaXMuX2NvbmZpZy5z
dGVwQmFzZSkgOiBDYWxlbmRhclBpY2tlci5EZWZhdWx0U3RlcEJhc2U7Ci0gICAgdGhpcy55ZWFy
TW9udGhDb250cm9sbGVyID0gbmV3IFllYXJNb250aENvbnRyb2xsZXIodGhpcyk7Ci0gICAgdGhp
cy5kYXlzVGFibGUgPSBuZXcgRGF5c1RhYmxlKHRoaXMpOworICAgIHRoaXMuX21pbmltdW1Nb250
aCA9IE1vbnRoLmNyZWF0ZUZyb21EYXRlKG5ldyBEYXRlKHRoaXMuX21pbmltdW1WYWx1ZSkpOwor
ICAgIHRoaXMubWF4aW11bU1vbnRoID0gTW9udGguY3JlYXRlRnJvbURhdGUobmV3IERhdGUodGhp
cy5fbWF4aW11bVZhbHVlKSk7CisgICAgdGhpcy5fY3VycmVudE1vbnRoID0gbmV3IE1vbnRoKE5h
TiwgTmFOKTsKKyAgICB0aGlzLl95ZWFyTW9udGhDb250cm9sbGVyID0gbmV3IFllYXJNb250aENv
bnRyb2xsZXIodGhpcyk7CisgICAgdGhpcy5fZGF5c1RhYmxlID0gbmV3IERheXNUYWJsZSh0aGlz
KTsKICAgICB0aGlzLl9oYWRLZXlFdmVudCA9IGZhbHNlOwogICAgIHRoaXMuX2xheW91dCgpOwot
ICAgIHZhciBpbml0aWFsRGF0ZSA9IHBhcnNlRGF0ZVN0cmluZyh0aGlzLl9jb25maWcuY3VycmVu
dFZhbHVlKTsKLSAgICBpZiAoaW5pdGlhbERhdGUgPCB0aGlzLm1pbmltdW1EYXRlKQotICAgICAg
ICBpbml0aWFsRGF0ZSA9IHRoaXMubWluaW11bURhdGU7Ci0gICAgZWxzZSBpZiAoaW5pdGlhbERh
dGUgPiB0aGlzLm1heGltdW1EYXRlKQotICAgICAgICBpbml0aWFsRGF0ZSA9IHRoaXMubWF4aW11
bURhdGU7Ci0gICAgdGhpcy5kYXlzVGFibGUuc2VsZWN0RGF0ZShpbml0aWFsRGF0ZSk7CisgICAg
dmFyIGluaXRpYWxTZWxlY3Rpb24gPSBwYXJzZURhdGVTdHJpbmcodGhpcy5fY29uZmlnLmN1cnJl
bnRWYWx1ZSk7CisgICAgaWYgKCFpbml0aWFsU2VsZWN0aW9uKQorICAgICAgICBpbml0aWFsU2Vs
ZWN0aW9uID0gRGF5LmNyZWF0ZUZyb21Ub2RheSgpOworICAgIGlmIChpbml0aWFsU2VsZWN0aW9u
LnZhbHVlT2YoKSA8IHRoaXMuX21pbmltdW1WYWx1ZSkKKyAgICAgICAgaW5pdGlhbFNlbGVjdGlv
biA9IG5ldyBEYXkodGhpcy5fbWluaW11bVZhbHVlKTsKKyAgICBlbHNlIGlmIChpbml0aWFsU2Vs
ZWN0aW9uLnZhbHVlT2YoKSA+IHRoaXMuX21heGltdW1WYWx1ZSkKKyAgICAgICAgaW5pdGlhbFNl
bGVjdGlvbiA9IG5ldyBEYXkodGhpcy5fbWF4aW11bVZhbHVlKTsKKyAgICB0aGlzLnNob3dNb250
aChNb250aC5jcmVhdGVGcm9tRGF0ZShpbml0aWFsU2VsZWN0aW9uLnN0YXJ0RGF0ZSgpKSwgZmFs
c2UpOworICAgIHRoaXMuX2RheXNUYWJsZS5zZWxlY3RSYW5nZShpbml0aWFsU2VsZWN0aW9uKTsK
ICAgICB0aGlzLmZpeFdpbmRvd1NpemUoKTsKICAgICB0aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJv
dW5kID0gdGhpcy5faGFuZGxlQm9keUtleURvd24uYmluZCh0aGlzKTsKICAgICBkb2N1bWVudC5i
b2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJv
dW5kLCBmYWxzZSk7CiB9CiBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KFBpY2tlci5wcm90b3R5cGUpOwogCi0vLyBIYXJkIGxpbWl0cyBvZiB0eXBlPWRhdGUuIFNlZSBX
ZWJDb3JlL3BsYXRmb3JtL0RhdGVDb21wb25lbnRzLmguCi1DYWxlbmRhclBpY2tlci5NaW5pbXVt
UG9zc2libGVEYXRlID0gbmV3IERhdGUoLTYyMTM1NTk2ODAwMDAwLjApOwotQ2FsZW5kYXJQaWNr
ZXIuTWF4aW11bVBvc3NpYmxlRGF0ZSA9IG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDAuMCk7CiAv
LyBTZWUgV2ViQ29yZS9odG1sL0RhdGVJbnB1dFR5cGUuY3BwLgogQ2FsZW5kYXJQaWNrZXIuRGVm
YXVsdFN0ZXBTY2FsZUZhY3RvciA9IDg2NDAwMDAwOwogQ2FsZW5kYXJQaWNrZXIuRGVmYXVsdFN0
ZXBCYXNlID0gMC4wOwpAQCAtNDU3LDE3ICs1NDYsMTcgQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90
eXBlLmNsZWFudXAgPSBmdW5jdGlvbigpIHsKIENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5
b3V0ID0gZnVuY3Rpb24oKSB7CiAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0NhbGVuZGFyUlRMKQog
ICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInJ0bCIpOwotICAgIHRoaXMueWVh
ck1vbnRoQ29udHJvbGxlci5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsKLSAgICB0aGlzLmRheXNU
YWJsZS5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsKKyAgICB0aGlzLl95ZWFyTW9udGhDb250cm9s
bGVyLmF0dGFjaFRvKHRoaXMuX2VsZW1lbnQpOworICAgIHRoaXMuX2RheXNUYWJsZS5hdHRhY2hU
byh0aGlzLl9lbGVtZW50KTsKICAgICB0aGlzLl9sYXlvdXRCdXR0b25zKCk7CiAgICAgLy8gRGF5
c1RhYmxlIHdpbGwgaGF2ZSBmb2N1cyBidXQgd2UgZG9uJ3Qgd2FudCB0byBzaG93IGl0cyBmb2N1
cyByaW5nIHVudGlsIHRoZSBmaXJzdCBrZXkgZXZlbnQuCiAgICAgdGhpcy5fZWxlbWVudC5jbGFz
c0xpc3QuYWRkKENsYXNzTmFtZXMuTm9Gb2N1c1JpbmcpOwogfTsKIAogQ2FsZW5kYXJQaWNrZXIu
cHJvdG90eXBlLmhhbmRsZVRvZGF5ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGRhdGUgPSBuZXcg
RGF0ZSgpOwotICAgIHRoaXMuZGF5c1RhYmxlLnNlbGVjdERhdGUoZGF0ZSk7Ci0gICAgdGhpcy5z
dWJtaXRWYWx1ZShzZXJpYWxpemVEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250
aCgpLCBkYXRlLmdldERhdGUoKSkpOworICAgIHZhciB0b2RheSA9IERheS5jcmVhdGVGcm9tVG9k
YXkoKTsKKyAgICB0aGlzLl9kYXlzVGFibGUuc2VsZWN0UmFuZ2UodG9kYXkpOworICAgIHRoaXMu
c3VibWl0VmFsdWUodG9kYXkudG9TdHJpbmcoKSk7CiB9OwogCiBDYWxlbmRhclBpY2tlci5wcm90
b3R5cGUuaGFuZGxlQ2xlYXIgPSBmdW5jdGlvbigpIHsKQEAgLTUyOCw2ICs2MTcsMjYgQEAgQ2Fs
ZW5kYXJQaWNrZXIucHJvdG90eXBlLl9sYXlvdXRCdXR0b25zID0gZnVuY3Rpb24oKSB7CiAgICAg
dGhpcy5sYXN0Rm9jdXNhYmxlQ29udHJvbCA9IHRoaXMuY2xlYXIgfHwgdGhpcy50b2RheTsKIH07
CiAKK0NhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5zaG91bGRTaG93TW9udGggPSBmdW5jdGlvbiht
b250aCkgeworICAgIHJldHVybiB0aGlzLl9taW5pbXVtTW9udGgudmFsdWVPZigpIDw9IG1vbnRo
LnZhbHVlT2YoKSAmJiB0aGlzLm1heGltdW1Nb250aC52YWx1ZU9mKCkgPj0gbW9udGgudmFsdWVP
ZigpOworfTsKKworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3dNb250aCA9IGZ1bmN0aW9u
KG1vbnRoLCBhbmltYXRlLCBrZWVwU2VsZWN0aW9uUG9zaXRpb24pIHsKKyAgICBpZiAodGhpcy5f
Y3VycmVudE1vbnRoLmVxdWFscyhtb250aCkpCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlIGlm
IChtb250aC52YWx1ZU9mKCkgPCB0aGlzLl9taW5pbXVtTW9udGgudmFsdWVPZigpKQorICAgICAg
ICBtb250aCA9IHRoaXMuX21pbmltdW1Nb250aDsKKyAgICBlbHNlIGlmIChtb250aC52YWx1ZU9m
KCkgPiB0aGlzLm1heGltdW1Nb250aC52YWx1ZU9mKCkpCisgICAgICAgIG1vbnRoID0gdGhpcy5t
YXhpbXVtTW9udGg7CisgICAgdGhpcy5feWVhck1vbnRoQ29udHJvbGxlci5zZXRNb250aChtb250
aCk7CisgICAgdGhpcy5fZGF5c1RhYmxlLm5hdmlnYXRlVG9Nb250aChtb250aCwgYW5pbWF0ZSwg
a2VlcFNlbGVjdGlvblBvc2l0aW9uKTsKKyAgICB0aGlzLl9jdXJyZW50TW9udGggPSBtb250aDsK
K307CisKK0NhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5jdXJyZW50TW9udGggPSBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5fY3VycmVudE1vbnRoOworfTsKKwogLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAv
KioKQEAgLTUzNiwxMCArNjQ1LDYgQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9sYXlvdXRC
dXR0b25zID0gZnVuY3Rpb24oKSB7CiAgKi8KIGZ1bmN0aW9uIFllYXJNb250aENvbnRyb2xsZXIo
cGlja2VyKSB7CiAgICAgdGhpcy5waWNrZXIgPSBwaWNrZXI7Ci0gICAgLyoqCi0gICAgICogQHR5
cGUgez9Nb250aH0KLSAgICAgKi8KLSAgICB0aGlzLl9jdXJyZW50TW9udGggPSBudWxsOwogfQog
CiAvKioKQEAgLTU3NiwxNCArNjgxLDEyIEBAIFllYXJNb250aENvbnRyb2xsZXIucHJvdG90eXBl
LmF0dGFjaFRvID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgIHRoaXMuX3dhbGwuYWRkRXZlbnRM
aXN0ZW5lcigiY2xpY2siLCB0aGlzLl9jbG9zZVBvcHVwLmJpbmQodGhpcyksIGZhbHNlKTsKICAg
ICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3dhbGwpOwogCi0gICAgdmFyIG1heGltdW1ZZWFy
ID0gdGhpcy5waWNrZXIubWF4aW11bURhdGUuZ2V0VVRDRnVsbFllYXIoKTsKLSAgICAvLyBCZWNh
dXNlIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHllYXIgaXMgU2VwdGVtYmVyIHdlIHNob3VsZCB1c2Ug
dGhlIHllYXIgYmVmb3JlIGl0LgotICAgIGlmIChtYXhpbXVtWWVhciA9PT0gTW9udGguTWF4aW11
bS55ZWFyKQotICAgICAgICBtYXhpbXVtWWVhci0tOworICAgIHZhciBtb250aCA9IHRoaXMucGlj
a2VyLm1heGltdW1Nb250aDsKICAgICB2YXIgbWF4V2lkdGggPSAwOwogICAgIGZvciAodmFyIG0g
PSAwOyBtIDwgMTI7ICsrbSkgewotICAgICAgICB0aGlzLl9tb250aC50ZXh0Q29udGVudCA9IG5l
dyBNb250aChtYXhpbXVtWWVhciwgbSkudG9Mb2NhbGVTdHJpbmcoKTsKKyAgICAgICAgdGhpcy5f
bW9udGgudGV4dENvbnRlbnQgPSBtb250aC50b0xvY2FsZVN0cmluZygpOwogICAgICAgICBtYXhX
aWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCB0aGlzLl9tb250aC5vZmZzZXRXaWR0aCk7CisgICAg
ICAgIG1vbnRoID0gbW9udGgucHJldmlvdXMoKTsKICAgICB9CiAgICAgaWYgKGdldExhbmd1YWdl
KCkgPT0gImphIiAmJiBJbXBlcmlhbEVyYUxpbWl0IDwgbWF4aW11bVllYXIpIHsKICAgICAgICAg
Zm9yICh2YXIgbSA9IDA7IG0gPCAxMjsgKyttKSB7CkBAIC02NTQsNDQgKzc1NywzMCBAQCBZZWFy
TW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5fYXR0YWNoUmlnaHRCdXR0b25zVG8gPSBmdW5jdGlv
bihwYXJlbnQpIHsKIH07CiAKIC8qKgotICogQHJldHVybiB7P01vbnRofQotICovCi1ZZWFyTW9u
dGhDb250cm9sbGVyLnByb3RvdHlwZS5tb250aCA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0
aGlzLl9jdXJyZW50TW9udGg7Ci19OwotCi0vKioKICAqIEBwYXJhbSB7IU1vbnRofSBtb250aAog
ICovCiBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5zZXRNb250aCA9IGZ1bmN0aW9uKG1v
bnRoKSB7Ci0gICAgdGhpcy5fY3VycmVudE1vbnRoID0gbmV3IE1vbnRoKG1vbnRoKTsKLSAgICB0
aGlzLl9yZWRyYXcoKTsKLX07Ci0KLVllYXJNb250aENvbnRyb2xsZXIucHJvdG90eXBlLl9yZWRy
YXcgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWluID0gTW9udGguY3JlYXRlRnJvbURhdGUodGhp
cy5waWNrZXIubWluaW11bURhdGUpLnZhbHVlT2YoKTsKLSAgICB2YXIgbWF4ID0gTW9udGguY3Jl
YXRlRnJvbURhdGUodGhpcy5waWNrZXIubWF4aW11bURhdGUpLnZhbHVlT2YoKTsKLSAgICB2YXIg
Y3VycmVudCA9IHRoaXMuX2N1cnJlbnRNb250aC52YWx1ZU9mKCk7CisgICAgdmFyIG1vbnRoVmFs
dWUgPSBtb250aC52YWx1ZU9mKCk7CiAgICAgaWYgKHRoaXMuX2xlZnQzKQotICAgICAgICB0aGlz
Ll9sZWZ0My5kaXNhYmxlZCA9IGN1cnJlbnQgLSAxMyA8IG1pbjsKLSAgICB0aGlzLl9sZWZ0Mi5k
aXNhYmxlZCA9IGN1cnJlbnQgLSAyIDwgbWluOwotICAgIHRoaXMuX2xlZnQxLmRpc2FibGVkID0g
Y3VycmVudCAtIDEgPCBtaW47Ci0gICAgdGhpcy5fcmlnaHQxLmRpc2FibGVkID0gY3VycmVudCAr
IDEgPiBtYXg7Ci0gICAgdGhpcy5fcmlnaHQyLmRpc2FibGVkID0gY3VycmVudCArIDIgPiBtYXg7
CisgICAgICAgIHRoaXMuX2xlZnQzLmRpc2FibGVkID0gIXRoaXMucGlja2VyLnNob3VsZFNob3dN
b250aChuZXcgTW9udGgobW9udGhWYWx1ZSAtIDEyMSkpOworICAgIHRoaXMuX2xlZnQyLmRpc2Fi
bGVkID0gIXRoaXMucGlja2VyLnNob3VsZFNob3dNb250aChuZXcgTW9udGgobW9udGhWYWx1ZSAt
IDEyKSk7CisgICAgdGhpcy5fbGVmdDEuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuc2hvdWxkU2hv
d01vbnRoKG5ldyBNb250aChtb250aFZhbHVlIC0gMSkpOworICAgIHRoaXMuX3JpZ2h0MS5kaXNh
YmxlZCA9ICF0aGlzLnBpY2tlci5zaG91bGRTaG93TW9udGgobmV3IE1vbnRoKG1vbnRoVmFsdWUg
KyAxKSk7CisgICAgdGhpcy5fcmlnaHQyLmRpc2FibGVkID0gIXRoaXMucGlja2VyLnNob3VsZFNo
b3dNb250aChuZXcgTW9udGgobW9udGhWYWx1ZSArIDEyKSk7CiAgICAgaWYgKHRoaXMuX3JpZ2h0
MykKLSAgICAgICAgdGhpcy5fcmlnaHQzLmRpc2FibGVkID0gY3VycmVudCArIDEzID4gbWF4Owot
ICAgIHRoaXMuX21vbnRoLmlubmVyVGV4dCA9IHRoaXMuX2N1cnJlbnRNb250aC50b0xvY2FsZVN0
cmluZygpOworICAgICAgICB0aGlzLl9sZWZ0My5kaXNhYmxlZCA9ICF0aGlzLnBpY2tlci5zaG91
bGRTaG93TW9udGgobmV3IE1vbnRoKG1vbnRoVmFsdWUgKyAxMjEpKTsKKyAgICB0aGlzLl9tb250
aC5pbm5lclRleHQgPSBtb250aC50b0xvY2FsZVN0cmluZygpOwogICAgIHdoaWxlICh0aGlzLl9t
b250aFBvcHVwQ29udGVudHMuaGFzQ2hpbGROb2RlcygpKQogICAgICAgICB0aGlzLl9tb250aFBv
cHVwQ29udGVudHMucmVtb3ZlQ2hpbGQodGhpcy5fbW9udGhQb3B1cENvbnRlbnRzLmZpcnN0Q2hp
bGQpOwogCi0gICAgZm9yICh2YXIgbSA9IGN1cnJlbnQgLSA2OyBtIDw9IGN1cnJlbnQgKyA2OyBt
KyspIHsKLSAgICAgICAgaWYgKG0gPCBtaW4gfHwgbSA+IG1heCkKLSAgICAgICAgICAgIGNvbnRp
bnVlOworICAgIGZvciAodmFyIG0gPSBtb250aFZhbHVlIC0gNjsgbSA8PSBtb250aFZhbHVlICsg
NjsgbSsrKSB7CiAgICAgICAgIHZhciBtb250aCA9IG5ldyBNb250aChtKTsKKyAgICAgICAgaWYg
KCF0aGlzLnBpY2tlci5zaG91bGRTaG93TW9udGgobW9udGgpKQorICAgICAgICAgICAgY29udGlu
dWU7CiAgICAgICAgIHZhciBvcHRpb24gPSBjcmVhdGVFbGVtZW50KCJkaXYiLCBDbGFzc05hbWVz
Lk1vbnRoU2VsZWN0b3JQb3B1cEVudHJ5LCBtb250aC50b0xvY2FsZVN0cmluZygpKTsKICAgICAg
ICAgb3B0aW9uLmRhdGFzZXQudmFsdWUgPSBtb250aC50b1N0cmluZygpOwogICAgICAgICB0aGlz
Ll9tb250aFBvcHVwQ29udGVudHMuYXBwZW5kQ2hpbGQob3B0aW9uKTsKLSAgICAgICAgaWYgKG0g
PT0gY3VycmVudCkKKyAgICAgICAgaWYgKG0gPT0gbW9udGhWYWx1ZSkKICAgICAgICAgICAgIG9w
dGlvbi5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZXMuU2VsZWN0ZWRNb250aFllYXIpOwogICAgIH0K
IH07CkBAIC04MTAsNyArODk5LDcgQEAgWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX2hh
bmRsZVllYXJNb250aENoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgIHZhciBzZWxlY3Rpb24gPSB0
aGlzLl9nZXRTZWxlY3Rpb24oKTsKICAgICBpZiAoIXNlbGVjdGlvbikKICAgICAgICAgcmV0dXJu
OwotICAgIHRoaXMucGlja2VyLmRheXNUYWJsZS5uYXZpZ2F0ZVRvTW9udGhBbmRLZWVwU2VsZWN0
aW9uUG9zaXRpb24oTW9udGgucGFyc2Uoc2VsZWN0aW9uLmRhdGFzZXQudmFsdWUpKTsKKyAgICB0
aGlzLnBpY2tlci5zaG93TW9udGgoTW9udGgucGFyc2Uoc2VsZWN0aW9uLmRhdGFzZXQudmFsdWUp
KTsKIH07CiAKIC8qCkBAIC04NjgsMTcgKzk1Nyw5IEBAIFllYXJNb250aENvbnRyb2xsZXIucHJv
dG90eXBlLl9oYW5kbGVCdXR0b25DbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgKiBAcGFyYW0g
eyFudW1iZXJ9IGFtb3VudAogICovCiBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5tb3Zl
UmVsYXRpdmVseSA9IGZ1bmN0aW9uKGFtb3VudCkgewotICAgIHZhciBtaW4gPSBNb250aC5jcmVh
dGVGcm9tRGF0ZSh0aGlzLnBpY2tlci5taW5pbXVtRGF0ZSkudmFsdWVPZigpOwotICAgIHZhciBt
YXggPSBNb250aC5jcmVhdGVGcm9tRGF0ZSh0aGlzLnBpY2tlci5tYXhpbXVtRGF0ZSkudmFsdWVP
ZigpOwotICAgIHZhciBjdXJyZW50ID0gdGhpcy5fY3VycmVudE1vbnRoLnZhbHVlT2YoKTsKLSAg
ICB2YXIgdXBkYXRlZCA9IGN1cnJlbnQ7Ci0gICAgaWYgKGFtb3VudCA8IDApCi0gICAgICAgIHVw
ZGF0ZWQgPSBjdXJyZW50ICsgYW1vdW50ID49IG1pbiA/IGN1cnJlbnQgKyBhbW91bnQgOiBtaW47
Ci0gICAgZWxzZQotICAgICAgICB1cGRhdGVkID0gY3VycmVudCArIGFtb3VudCA8PSBtYXggPyBj
dXJyZW50ICsgYW1vdW50IDogbWF4OwotICAgIGlmICh1cGRhdGVkID09IGN1cnJlbnQpCi0gICAg
ICAgIHJldHVybjsKLSAgICB0aGlzLnBpY2tlci5kYXlzVGFibGUubmF2aWdhdGVUb01vbnRoQW5k
S2VlcFNlbGVjdGlvblBvc2l0aW9uKG5ldyBNb250aCh1cGRhdGVkKSk7CisgICAgdmFyIGN1cnJl
bnQgPSB0aGlzLnBpY2tlci5jdXJyZW50TW9udGgoKS52YWx1ZU9mKCk7CisgICAgdmFyIHVwZGF0
ZWQgPSBuZXcgTW9udGgoY3VycmVudCArIGFtb3VudCk7CisgICAgdGhpcy5waWNrZXIuc2hvd01v
bnRoKHVwZGF0ZWQsIHRydWUsIHRydWUpOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODg5LDEwICs5
NzAsNiBAQCBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5tb3ZlUmVsYXRpdmVseSA9IGZ1
bmN0aW9uKGFtb3VudCkgewogICovCiBmdW5jdGlvbiBEYXlzVGFibGUocGlja2VyKSB7CiAgICAg
dGhpcy5waWNrZXIgPSBwaWNrZXI7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgez9Nb250aH0KLSAg
ICAgKi8KLSAgICB0aGlzLl9jdXJyZW50TW9udGggPSBudWxsOwogfQogCiAvKioKQEAgLTk1MCwy
NCArMTAyNywyNSBAQCBEYXlzVGFibGUucHJvdG90eXBlLmF0dGFjaFRvID0gZnVuY3Rpb24oZWxl
bWVudCkgewogICogQHBhcmFtIHshbnVtYmVyfSB0aW1lIGRhdGUgaW4gbWlsbGlzZWNvbmQuCiAg
KiBAcmV0dXJuIHshYm9vbGVhbn0KICAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnN0ZXBN
aXNtYXRjaCA9IGZ1bmN0aW9uKHRpbWUpIHsKLSAgICByZXR1cm4gKHRpbWUgLSB0aGlzLnN0ZXBC
YXNlKSAlIHRoaXMuc3RlcCAhPSAwOworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9zdGVwTWlz
bWF0Y2ggPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJldHVybiAodmFsdWUgLSB0aGlzLnN0ZXBC
YXNlKSAlIHRoaXMuc3RlcCAhPSAwOwogfQogCiAvKioKICAqIEBwYXJhbSB7IW51bWJlcn0gdGlt
ZSBkYXRlIGluIG1pbGxpc2Vjb25kLgogICogQHJldHVybiB7IWJvb2xlYW59CiAgKi8KLUNhbGVu
ZGFyUGlja2VyLnByb3RvdHlwZS5vdXRPZlJhbmdlID0gZnVuY3Rpb24odGltZSkgewotICAgIHJl
dHVybiB0aW1lIDwgdGhpcy5taW5pbXVtRGF0ZS5nZXRUaW1lKCkgfHwgdGltZSA+IHRoaXMubWF4
aW11bURhdGUuZ2V0VGltZSgpOworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9vdXRPZlJhbmdl
ID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPCB0aGlzLl9taW5pbXVtVmFs
dWUgfHwgdmFsdWUgPiB0aGlzLl9tYXhpbXVtVmFsdWU7CiB9CiAKIC8qKgogICogQHBhcmFtIHsh
bnVtYmVyfSB0aW1lIGRhdGUgaW4gbWlsbGlzZWNvbmQuCiAgKiBAcmV0dXJuIHshYm9vbGVhbn0K
ICAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmlzVmFsaWREYXRlID0gZnVuY3Rpb24odGlt
ZSkgewotICAgIHJldHVybiAhdGhpcy5vdXRPZlJhbmdlKHRpbWUpICYmICF0aGlzLnN0ZXBNaXNt
YXRjaCh0aW1lKTsKK0NhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5pc1ZhbGlkRGF0ZSA9IGZ1bmN0
aW9uKHJhbmdlKSB7CisgICAgdmFyIHZhbHVlID0gcmFuZ2UudmFsdWVPZigpOworICAgIHJldHVy
biAhdGhpcy5fb3V0T2ZSYW5nZSh2YWx1ZSkgJiYgIXRoaXMuX3N0ZXBNaXNtYXRjaCh2YWx1ZSk7
CiB9CiAKIC8qKgpAQCAtOTc1LDggKzEwNTMsNyBAQCBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUu
aXNWYWxpZERhdGUgPSBmdW5jdGlvbih0aW1lKSB7CiAgKiBAcGFyYW0geyFudW1iZXJ9IG1vbnRo
CiAgKi8KIERheXNUYWJsZS5wcm90b3R5cGUuX3JlbmRlck1vbnRoID0gZnVuY3Rpb24obW9udGgp
IHsKLSAgICB0aGlzLl9jdXJyZW50TW9udGggPSBuZXcgTW9udGgobW9udGgpOwotICAgIHZhciBk
YXlJdGVyYXRvciA9IHRoaXMuX2N1cnJlbnRNb250aC5zdGFydERhdGUoKTsKKyAgICB2YXIgZGF5
SXRlcmF0b3IgPSBtb250aC5zdGFydERhdGUoKTsKICAgICB2YXIgbW9udGhTdGFydERheSA9IGRh
eUl0ZXJhdG9yLmdldFVUQ0RheSgpOwogICAgIHZhciB3ZWVrU3RhcnREYXkgPSBnbG9iYWwucGFy
YW1zLndlZWtTdGFydERheSB8fCAwOwogICAgIHZhciBzdGFydE9mZnNldCA9IHdlZWtTdGFydERh
eSAtIG1vbnRoU3RhcnREYXk7CkBAIC05OTAsMTUgKzEwNjcsMTMgQEAgRGF5c1RhYmxlLnByb3Rv
dHlwZS5fcmVuZGVyTW9udGggPSBmdW5jdGlvbihtb250aCkgewogICAgICAgICAgICAgdmFyIGVs
ZW1lbnQgPSB0aGlzLl9kYXlzW3ddW2RdOwogICAgICAgICAgICAgZWxlbWVudC5pbm5lclRleHQg
PSBsb2NhbGl6ZU51bWJlcihkYXlJdGVyYXRvci5nZXRVVENEYXRlKCkpOwogICAgICAgICAgICAg
ZWxlbWVudC5jbGFzc05hbWUgPSBDbGFzc05hbWVzLkRheTsKLSAgICAgICAgICAgIGVsZW1lbnQu
ZGF0YXNldC5zdWJtaXRWYWx1ZSA9IHNlcmlhbGl6ZURhdGUoaXRlck1vbnRoLnllYXIsIGl0ZXJN
b250aC5tb250aCwgZGF5SXRlcmF0b3IuZ2V0VVRDRGF0ZSgpKTsKKyAgICAgICAgICAgIGVsZW1l
bnQuZGF0YXNldC5zdWJtaXRWYWx1ZSA9IERheS5jcmVhdGVGcm9tRGF0ZShkYXlJdGVyYXRvciku
dG9TdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChpc05hTih0aW1lKSkgewogICAgICAgICAgICAg
ICAgIGVsZW1lbnQuaW5uZXJUZXh0ID0gIi0iOwogICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xh
c3NMaXN0LmFkZChDbGFzc05hbWVzLlVuYXZhaWxhYmxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBp
ZiAodGhpcy5waWNrZXIub3V0T2ZSYW5nZSh0aW1lKSkKLSAgICAgICAgICAgICAgICBlbGVtZW50
LmNsYXNzTGlzdC5hZGQoQ2xhc3NOYW1lcy5VbmF2YWlsYWJsZSk7Ci0gICAgICAgICAgICBlbHNl
IGlmICh0aGlzLnBpY2tlci5zdGVwTWlzbWF0Y2godGltZSkpCisgICAgICAgICAgICB9IGVsc2Ug
aWYgKCF0aGlzLnBpY2tlci5pc1ZhbGlkRGF0ZShEYXkuY3JlYXRlRnJvbURhdGUoZGF5SXRlcmF0
b3IpKSkKICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ2xhc3NOYW1lcy5V
bmF2YWlsYWJsZSk7Ci0gICAgICAgICAgICBlbHNlIGlmICghaXRlck1vbnRoLmVxdWFscyh0aGlz
Ll9jdXJyZW50TW9udGgpKSB7CisgICAgICAgICAgICBlbHNlIGlmICghaXRlck1vbnRoLmVxdWFs
cyhtb250aCkpIHsKICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ2xhc3NO
YW1lcy5BdmFpbGFibGUpOwogICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChD
bGFzc05hbWVzLk5vdFRoaXNNb250aCk7CiAgICAgICAgICAgICB9IGVsc2UKQEAgLTEwMDcsMzEg
KzEwODIsMjYgQEAgRGF5c1RhYmxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGggPSBmdW5jdGlvbiht
b250aCkgewogICAgICAgICB9CiAgICAgfQogCi0gICAgdGhpcy5waWNrZXIudG9kYXkuZGlzYWJs
ZWQgPSAhdGhpcy5waWNrZXIuaXNWYWxpZERhdGUocGFyc2VEYXRlU3RyaW5nKCkuZ2V0VGltZSgp
KTsKKyAgICB0aGlzLnBpY2tlci50b2RheS5kaXNhYmxlZCA9ICF0aGlzLnBpY2tlci5pc1ZhbGlk
RGF0ZShEYXkuY3JlYXRlRnJvbVRvZGF5KCkudmFsdWVPZigpKTsKIH07CiAKIC8qKgogICogQHBh
cmFtIHshTW9udGh9IG1vbnRoCiAgKi8KLURheXNUYWJsZS5wcm90b3R5cGUuX25hdmlnYXRlVG9N
b250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7Ci0gICAgdGhpcy5waWNrZXIueWVhck1vbnRoQ29udHJv
bGxlci5zZXRNb250aChtb250aCk7Ci0gICAgdGhpcy5fcmVuZGVyTW9udGgobW9udGgpOwotfTsK
LQotLyoqCi0gKiBAcGFyYW0geyFNb250aH0gbW9udGgKLSAqLwotRGF5c1RhYmxlLnByb3RvdHlw
ZS5fbmF2aWdhdGVUb01vbnRoV2l0aEFuaW1hdGlvbiA9IGZ1bmN0aW9uKG1vbnRoKSB7Ci0gICAg
aWYgKHRoaXMuX2N1cnJlbnRNb250aCkgewotICAgICAgICB2YXIgZGVsdGEgPSB0aGlzLl9jdXJy
ZW50TW9udGgudmFsdWVPZigpIC0gbW9udGgudmFsdWVPZigpOwotICAgICAgICBpZiAoZGVsdGEg
PT09IDApCi0gICAgICAgICAgICByZXR1cm47CitEYXlzVGFibGUucHJvdG90eXBlLm5hdmlnYXRl
VG9Nb250aCA9IGZ1bmN0aW9uKG1vbnRoLCBhbmltYXRlLCBrZWVwU2VsZWN0aW9uUG9zaXRpb24p
IHsKKyAgICB2YXIgZmlyc3ROb2RlSW5TZWxlY3RlZFJhbmdlID0gdGhpcy5fZmlyc3ROb2RlSW5T
ZWxlY3RlZFJhbmdlKCk7CisgICAgaWYgKGFuaW1hdGUpIHsKICAgICAgICAgdmFyIGRheXNTdHls
ZSA9IHRoaXMuX2RheXNDb250YWluZXIuc3R5bGU7CiAgICAgICAgIGRheXNTdHlsZS5wb3NpdGlv
biA9ICJyZWxhdGl2ZSI7CiAgICAgICAgIGRheXNTdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gImxl
ZnQgMC4xcyBlYXNlIjsKLSAgICAgICAgZGF5c1N0eWxlLmxlZnQgPSAoZGVsdGEgPiAwID8gIiIg
OiAiLSIpICsgdGhpcy5fZGF5c0NvbnRhaW5lci5vZmZzZXRXaWR0aCArICJweCI7CisgICAgICAg
IGRheXNTdHlsZS5sZWZ0ID0gKHRoaXMucGlja2VyLmN1cnJlbnRNb250aCgpLnZhbHVlT2YoKSA+
IG1vbnRoLnZhbHVlT2YoKSA/ICIiIDogIi0iKSArIHRoaXMuX2RheXNDb250YWluZXIub2Zmc2V0
V2lkdGggKyAicHgiOworICAgIH0KKyAgICB0aGlzLl9yZW5kZXJNb250aChtb250aCk7CisgICAg
aWYgKGtlZXBTZWxlY3Rpb25Qb3NpdGlvbiAmJiBmaXJzdE5vZGVJblNlbGVjdGVkUmFuZ2UpIHsK
KyAgICAgICAgdmFyIHggPSBwYXJzZUludChmaXJzdE5vZGVJblNlbGVjdGVkUmFuZ2UuZGF0YXNl
dC5wb3NpdGlvblgsIDEwKTsKKyAgICAgICAgdmFyIHkgPSBwYXJzZUludChmaXJzdE5vZGVJblNl
bGVjdGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblksIDEwKTsKKyAgICAgICAgdGhpcy5fc2VsZWN0
UmFuZ2VBdFBvc2l0aW9uKHgsIHkpOwogICAgIH0KLSAgICB0aGlzLl9uYXZpZ2F0ZVRvTW9udGgo
bW9udGgpOwogfTsKIAogRGF5c1RhYmxlLnByb3RvdHlwZS5fbW92ZUluRGF5cyA9IGZ1bmN0aW9u
KCkgewpAQCAtMTA0NiwyNyArMTExNiwxMiBAQCBEYXlzVGFibGUucHJvdG90eXBlLl9tb3ZlSW5E
YXlzID0gZnVuY3Rpb24oKSB7CiB9OwogCiAvKioKLSAqIEBwYXJhbSB7IU1vbnRofSBtb250aAot
ICovCi1EYXlzVGFibGUucHJvdG90eXBlLm5hdmlnYXRlVG9Nb250aEFuZEtlZXBTZWxlY3Rpb25Q
b3NpdGlvbiA9IGZ1bmN0aW9uKG1vbnRoKSB7Ci0gICAgaWYgKHRoaXMuX2N1cnJlbnRNb250aC5l
cXVhbHMobW9udGgpKQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGZpcnN0Tm9kZUluU2VsZWN0
ZWRSYW5nZSA9IHRoaXMuX2ZpcnN0Tm9kZUluU2VsZWN0ZWRSYW5nZSgpOwotICAgIHRoaXMuX25h
dmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24obW9udGgpOwotICAgIGlmIChmaXJzdE5vZGVJblNl
bGVjdGVkUmFuZ2UpIHsKLSAgICAgICAgdmFyIHggPSBwYXJzZUludChmaXJzdE5vZGVJblNlbGVj
dGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblgsIDEwKTsKLSAgICAgICAgdmFyIHkgPSBwYXJzZUlu
dChmaXJzdE5vZGVJblNlbGVjdGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblksIDEwKTsKLSAgICAg
ICAgdGhpcy5fc2VsZWN0UmFuZ2VBdFBvc2l0aW9uKHgsIHkpOwotICAgIH0KLX07Ci0KLS8qKgog
ICogQHBhcmFtIHshRGF0ZX0gZGF0ZQogICovCi1EYXlzVGFibGUucHJvdG90eXBlLnNlbGVjdERh
dGUgPSBmdW5jdGlvbihkYXRlKSB7CitEYXlzVGFibGUucHJvdG90eXBlLnNlbGVjdFJhbmdlID0g
ZnVuY3Rpb24oZGF5KSB7CiAgICAgdGhpcy5fZGVzZWxlY3QoKTsKLSAgICB0aGlzLl9uYXZpZ2F0
ZVRvTW9udGhXaXRoQW5pbWF0aW9uKE1vbnRoLmNyZWF0ZUZyb21EYXRlKGRhdGUpKTsKLSAgICB2
YXIgZGF0ZVN0cmluZyA9IHNlcmlhbGl6ZURhdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRl
LmdldFVUQ01vbnRoKCksIGRhdGUuZ2V0VVRDRGF0ZSgpKTsKKyAgICB0aGlzLnBpY2tlci5zaG93
TW9udGgoTW9udGguY3JlYXRlRnJvbURhdGUoZGF5LnN0YXJ0RGF0ZSgpKSwgdHJ1ZSk7CisgICAg
dmFyIGRhdGVTdHJpbmcgPSBkYXkudG9TdHJpbmcoKTsKICAgICBmb3IgKHZhciB3ID0gMDsgdyA8
IERheXNUYWJsZS5fV2Vla3M7IHcrKykgewogICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IDc7
IGQrKykgewogICAgICAgICAgICAgaWYgKHRoaXMuX2RheXNbd11bZF0uZGF0YXNldC5zdWJtaXRW
YWx1ZSA9PSBkYXRlU3RyaW5nKSB7CkBAIC0xMTEzLDEwICsxMTY4LDEwIEBAIERheXNUYWJsZS5w
cm90b3R5cGUuX2Rlc2VsZWN0ID0gZnVuY3Rpb24oKSB7CiAgKiBAcmV0dXJuIHshYm9vbGVhbn0K
ICAqLwogRGF5c1RhYmxlLnByb3RvdHlwZS5fbWF5YmVTZXRQcmV2aW91c01vbnRoID0gZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGN1cnJlbnRNb250aCA9IHRoaXMucGlja2VyLnllYXJNb250aENvbnRy
b2xsZXIubW9udGgoKTsKLSAgICBpZiAodGhpcy5waWNrZXIubWluaW11bURhdGUgPj0gY3VycmVu
dE1vbnRoLnN0YXJ0RGF0ZSgpKQorICAgIHZhciBwcmV2aW91c01vbnRoID0gdGhpcy5waWNrZXIu
Y3VycmVudE1vbnRoKCkucHJldmlvdXMoKTsKKyAgICBpZiAoIXRoaXMucGlja2VyLnNob3VsZFNo
b3dNb250aChwcmV2aW91c01vbnRoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHRoaXMu
X25hdmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24oY3VycmVudE1vbnRoLnByZXZpb3VzKCkpOwor
ICAgIHRoaXMucGlja2VyLnNob3dNb250aChwcmV2aW91c01vbnRoKTsKICAgICByZXR1cm4gdHJ1
ZTsKIH07CiAKQEAgLTExMjQsMTAgKzExNzksMTAgQEAgRGF5c1RhYmxlLnByb3RvdHlwZS5fbWF5
YmVTZXRQcmV2aW91c01vbnRoID0gZnVuY3Rpb24oKSB7CiAgKiBAcmV0dXJuIHshYm9vbGVhbn0K
ICAqLwogRGF5c1RhYmxlLnByb3RvdHlwZS5fbWF5YmVTZXROZXh0TW9udGggPSBmdW5jdGlvbigp
IHsKLSAgICB2YXIgY3VycmVudE1vbnRoID0gdGhpcy5waWNrZXIueWVhck1vbnRoQ29udHJvbGxl
ci5tb250aCgpOwotICAgIGlmICh0aGlzLnBpY2tlci5tYXhpbXVtRGF0ZSA8IGN1cnJlbnRNb250
aC5lbmREYXRlKCkpCisgICAgdmFyIG5leHRNb250aCA9IHRoaXMucGlja2VyLmN1cnJlbnRNb250
aCgpLm5leHQoKTsKKyAgICBpZiAoIXRoaXMucGlja2VyLnNob3VsZFNob3dNb250aChuZXh0TW9u
dGgpKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdGhpcy5fbmF2aWdhdGVUb01vbnRoV2l0
aEFuaW1hdGlvbihjdXJyZW50TW9udGgubmV4dCgpKTsKKyAgICB0aGlzLnBpY2tlci5zaG93TW9u
dGgobmV4dE1vbnRoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH07CiAKQEAgLTEyMzcsNyArMTI5Miw3
IEBAIERheXNUYWJsZS5wcm90b3R5cGUuX2hhbmRsZUtleSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAg
ICAgICAgIH0KIAogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVKzAwNTQiKSB7IC8vICd0JwotICAg
ICAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUoKSk7CisgICAgICAgIHRoaXMuc2VsZWN0UmFu
Z2UoRGF5LmNyZWF0ZUZyb21Ub2RheSgpKTsKICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9u
KCk7CiAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgfQpAQCAtMTI3MSwxMSAr
MTMyNiwxMSBAQCBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX2hhbmRsZUJvZHlLZXlEb3duID0g
ZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgIHRoaXMubGFzdEZvY3VzYWJsZUNvbnRyb2wu
Zm9jdXMoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVKzAwNEQiKSB7IC8v
ICdtJwotICAgICAgICB0aGlzLnllYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZl
bnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzTW9udGggOiBZZWFyTW9u
dGhDb250cm9sbGVyLk5leHRNb250aCk7CisgICAgICAgIHRoaXMuX3llYXJNb250aENvbnRyb2xs
ZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlBy
ZXZpb3VzTW9udGggOiBZZWFyTW9udGhDb250cm9sbGVyLk5leHRNb250aCk7CiAgICAgfSBlbHNl
IGlmIChrZXkgPT0gIlUrMDA1OSIpIHsgLy8gJ3knCi0gICAgICAgIHRoaXMueWVhck1vbnRoQ29u
dHJvbGxlci5tb3ZlUmVsYXRpdmVseShldmVudC5zaGlmdEtleSA/IFllYXJNb250aENvbnRyb2xs
ZXIuUHJldmlvdXNZZWFyIDogWWVhck1vbnRoQ29udHJvbGxlci5OZXh0WWVhcik7CisgICAgICAg
IHRoaXMuX3llYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkg
PyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzWWVhciA6IFllYXJNb250aENvbnRyb2xsZXIu
TmV4dFllYXIpOwogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVKzAwNDQiKSB7IC8vICdkJwotICAg
ICAgICB0aGlzLnllYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRL
ZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzVGVuWWVhcnMgOiBZZWFyTW9udGhDb250
cm9sbGVyLk5leHRUZW5ZZWFycyk7CisgICAgICAgIHRoaXMuX3llYXJNb250aENvbnRyb2xsZXIu
bW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZp
b3VzVGVuWWVhcnMgOiBZZWFyTW9udGhDb250cm9sbGVyLk5leHRUZW5ZZWFycyk7CiAgICAgfSBl
bHNlIGlmIChrZXkgPT0gIlUrMDAxQiIpIC8vIEVTQwogICAgICAgICB0aGlzLmhhbmRsZUNhbmNl
bCgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172480</attachid>
            <date>2012-11-05 21:01:13 -0800</date>
            <delta_ts>2012-11-05 21:16:13 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101194-20121106135926.patch</filename>
            <type>text/plain</type>
            <size>27447</size>
            <attacher name="Keishi Hattori">keishi</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzNTU0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWM1MDhmYzk2NzQxOTI5
YTg4ODRiYTY3MzkzZTVmZDIxMjI1NjZjMS4uYzhjNDIxNjIxOWE1NGY5ZDY3MjY0NDNlYjBmYTU0
OTM0ODJiNmYwYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDEyLTExLTA1ICBLZWlz
aGkgSGF0dG9yaSAgPGtlaXNoaUB3ZWJraXQub3JnPgorCisgICAgICAgIEludHJvZHVjZSBEYXkg
Y2xhc3MgdG8gY2FsZW5kYXIgcGlja2VyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMDExOTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbnRyb2R1Y2luZyBEYXkgY2xhc3Mgc28gZGF5LCB3ZWVrLCBhbmQg
bW9udGggY2FuIGFsbCBiZSBhYnN0cmFjdGVkLiBUbworICAgICAgICBzb2x2ZSBzb21lIG9mIHRo
ZSBjb21wbGV4aXR5IGFyb3VuZCB3aGljaCBtb250aHMgdG8gc2hvdywgSSBtYWRlCisgICAgICAg
IENhbGVuZGFyUGlja2VyIGluIGNoYXJnZSBvZiBpdC4gVGhpcyBhbHNvIG1hZGUgWWVhck1vbnRo
Q29udHJvbGxlciBhbmQKKyAgICAgICAgRGF5c1RhYmxlIGluZGVwZW5kZW50IG9mIGVhY2ggb3Ro
ZXIuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiBDb3ZlcmVkIGJ5IGV4aXN0aW5nIGNhbGVuZGFy
LXBpY2tlci0qLmh0bWwgdGVzdHMuCisKKyAgICAgICAgKiBSZXNvdXJjZXMvcGFnZXBvcHVwcy9j
YWxlbmRhclBpY2tlci5qczoKKyAgICAgICAgKGNyZWF0ZVVUQ0RhdGUpOiBBbGxvdyBuZWdhdGl2
ZSBtb250aCBvciBkYXRlLgorICAgICAgICAocGFyc2VEYXRlU3RyaW5nKTogV2lsbCByZXR1cm4g
RGF5IG9yIE1vbnRoIGRlcGVuZGluZyBvbiBzdHJpbmcgZm9ybWF0LgorICAgICAgICAoRGF5KTog
UmVwcmVzZW50cyBhIGRheS4KKyAgICAgICAgKERheS5wYXJzZSk6IFBhcnNlIHl5eXktbW0tZGQu
CisgICAgICAgIChEYXkuY3JlYXRlRnJvbURhdGUpOiBDcmVhdGVzIGEgRGF5IHRoYXQgY29udGFp
bnMgYSBkYXRldGltZS4KKyAgICAgICAgKERheS5jcmVhdGVGcm9tVG9kYXkpOiBDcmVhdGVzIERh
eSBmb3IgdG9kYXkuIEEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIHRv
IFdlZWsgYW5kIE1vbnRoIGluIHRoZSBmdXR1cmUuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVx
dWFscyk6IFJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KKyAgICAgICAgKERheS5w
cm90b3R5cGUucHJldmlvdXMpOiBSZXR1cm5zIHRoZSBwcmV2aW91cyBkYXkuCisgICAgICAgIChE
YXkucHJvdG90eXBlLm5leHQpOiBSZXR1cm5zIHRoZSBuZXh0IGRheS4KKyAgICAgICAgKERheS5w
cm90b3R5cGUuc3RhcnREYXRlKTogUmV0dXJucyB0aGUgZGF0ZXRpbWUgdGhhdCBpcyB0aGUgc3Rh
cnQgb2YgdGhpcyBkYXkuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVuZERhdGUpOiBSZXR1cm5z
IHRoZSBkYXRldGltZSB0aGF0IGlzIHRoZSBzdGFydCBvZiB0aGlzIGRheS4KKyAgICAgICAgKERh
eS5wcm90b3R5cGUudmFsdWVPZik6IFJldHVybnMgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9j
aC4KKyAgICAgICAgKERheS5wcm90b3R5cGUudG9TdHJpbmcpOiBSZXR1cm5zIGFuIElTTyBkYXRl
IHN0cmluZy4KKyAgICAgICAgKE1vbnRoKTogRml4IGJ1ZyBpbiBjYWxjdWxhdGluZyBtb250aCBm
cm9tIHZhbHVlLgorICAgICAgICAoTW9udGgucHJvdG90eXBlLmVuZERhdGUpOiBVc2UgRGF5Lk1h
eGltdW0uCisgICAgICAgIChDYWxlbmRhclBpY2tlcik6IEFkZGVkIF9jdXJyZW50TW9udGguIHll
YXJNb250aENvbnRyb2xsZXIgYW5kIGRheXNUYWJsZSBjYW4gYmUgcHJpdmF0ZSBtZW1iZXJzIG5v
dy4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0KToKKyAgICAgICAg
KENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5oYW5kbGVUb2RheSk6IFVzZSBEYXkuY3JlYXRlRnJv
bVRvZGF5LgorICAgICAgICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3VsZFNob3dNb250
aCk6IFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9udGggc2hvdWxkIGJlIHNob3duLgorICAgICAgICAo
Q2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3dNb250aCk6IFNob3dzIHRoZSBnaXZlbiBtb250
aC4gSWYgdGhlIG1vbnRoIGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgbW9udGhzIHRoYXQgc2hvdWxk
IGJlIHNob3duLCB3ZSBjbGFtcCB0aGUgbW9udGggYW5kIHNob3cgdGhhdC4KKyAgICAgICAgKENh
bGVuZGFyUGlja2VyLnByb3RvdHlwZS5jdXJyZW50TW9udGgpOiBSZXR1cm5zIHRoZSBjdXJyZW50
IG1vbnRoIHRoYXQgaXMgc2hvd24uCisgICAgICAgIChZZWFyTW9udGhDb250cm9sbGVyKTogUmVt
b3ZlZCBfY3VycmVudE1vbnRoLgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5
cGUuYXR0YWNoVG8pOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuc2V0
TW9udGgpOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX2hhbmRsZVll
YXJNb250aENoYW5nZSk6IFVzZSBDYWxlbmRhclBpY2tlci5zaG93TW9udGgKKyAgICAgICAgKFll
YXJNb250aENvbnRyb2xsZXIucHJvdG90eXBlLm1vdmVSZWxhdGl2ZWx5KToKKyAgICAgICAgKERh
eXNUYWJsZSk6CisgICAgICAgIChDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX3N0ZXBNaXNtYXRj
aCk6IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fb3V0
T2ZSYW5nZSk6IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlw
ZS5pc1ZhbGlkRGF0ZSk6IFRha2UgRGF5IG9yIE1vbnRoIGluc3RlYWQgb2YgbWlsbGlzZWNvbmRz
IHNpbmNlIGVwb2NoLgorICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGgp
OgorICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5uYXZpZ2F0ZVRvTW9udGgpOiBTaG93cyBh
IGdpdmVuIG1vbnRoLiBDYW4gdXNlIGFuaW1hdGlvbiBhbmQgbGVhdmUgdGhlIHNlbGVjdGlvbiBw
b3NpdGlvbiBhcyBpcy4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuc2VsZWN0UmFuZ2Up
OiBTZWxlY3QgYSByYW5nZS4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuX21heWJlU2V0
UHJldmlvdXNNb250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9tYXliZVNldE5l
eHRNb250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9oYW5kbGVLZXkpOgorICAg
ICAgICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9oYW5kbGVCb2R5S2V5RG93bik6CisKIDIw
MTItMTEtMDUgIEtlbmljaGkgSXNoaWJhc2hpICA8YmFzaGlAY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFtDaHJvbWl1bV0gVW5pY29kZSBjb21iaW5pbmcgZGlhY3JpdGljYWwgYXJlbid0IGFsd2F5
cyBjb21iaW5lZCBvbiBMaW51eApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvUmVzb3VyY2Vz
L3BhZ2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuanMgYi9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMv
cGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcwppbmRleCA2NTYxNDZkMDA3MGVlN2YwOTliN2U0
ZTdlNjI2OTg0ZDgwMDVkY2VmLi5mNjhlMjc2YmI1Y2NiNjVjNTE5ZDZkN2RmNmI4ZmM0MmUwZjRh
YjUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxl
bmRhclBpY2tlci5qcworKysgYi9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9j
YWxlbmRhclBpY2tlci5qcwpAQCAtMTc1LDM5ICsxNzUsMTI2IEBAIE1vbnRoLnByb3RvdHlwZS50
b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uKCkgewogfTsKIAogZnVuY3Rpb24gY3JlYXRlVVRDRGF0
ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewotICAgIHZhciBuZXdEYXRlID0gbmV3IERhdGUoRGF0ZS5V
VEMoeWVhciwgbW9udGgsIGRhdGUpKTsKLSAgICBpZiAoeWVhciA8IDEwMCkKLSAgICAgICAgbmV3
RGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyKTsKKyAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKDAp
OworICAgIG5ld0RhdGUuc2V0VVRDRnVsbFllYXIoeWVhcik7CisgICAgbmV3RGF0ZS5zZXRVVENN
b250aChtb250aCk7CisgICAgbmV3RGF0ZS5zZXRVVENEYXRlKGRhdGUpOwogICAgIHJldHVybiBu
ZXdEYXRlOwogfTsKIAogLyoqCi0gKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jdXJyZW50Ci0gKiBA
cmV0dXJuIHshRGF0ZX0KKyAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlU3RyaW5nCisgKiBAcmV0dXJu
IHs/RGF5fE1vbnRofQorICovCitmdW5jdGlvbiBwYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZykg
eworICAgIHZhciBtb250aCA9IE1vbnRoLnBhcnNlKGRhdGVTdHJpbmcpOworICAgIGlmIChtb250
aCkKKyAgICAgICAgcmV0dXJuIG1vbnRoOworICAgIHJldHVybiBEYXkucGFyc2UoZGF0ZVN0cmlu
Zyk7Cit9CisKKy8qKgorICogQHBhcmFtIHshbnVtYmVyfERheX0gdmFsdWVPckRheU9yWWVhcgor
ICogQHBhcmFtIHshbnVtYmVyPX0gbW9udGgKKyAqIEBwYXJhbSB7IW51bWJlcj19IGRhdGUKKyAq
LworZnVuY3Rpb24gRGF5KHZhbHVlT3JEYXlPclllYXIsIG1vbnRoLCBkYXRlKSB7CisgICAgdmFy
IGRhdGVPYmplY3Q7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykKKyAgICAgICAgZGF0
ZU9iamVjdCA9IGNyZWF0ZVVUQ0RhdGUodmFsdWVPckRheU9yWWVhciwgbW9udGgsIGRhdGUpOwor
ICAgIGVsc2UgaWYgKHZhbHVlT3JEYXlPclllYXIgaW5zdGFuY2VvZiBEYXkpCisgICAgICAgIGRh
dGVPYmplY3QgPSBjcmVhdGVVVENEYXRlKHZhbHVlT3JEYXlPclllYXIueWVhciwgdmFsdWVPckRh
eU9yWWVhci5tb250aCwgdmFsdWVPckRheU9yWWVhci5kYXRlKTsKKyAgICBlbHNlCisgICAgICAg
IGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZU9yRGF5T3JZZWFyKTsKKyAgICB0aGlzLnllYXIg
PSBkYXRlT2JqZWN0LmdldFVUQ0Z1bGxZZWFyKCk7ICAgIAorICAgIHRoaXMubW9udGggPSBkYXRl
T2JqZWN0LmdldFVUQ01vbnRoKCk7CisgICAgdGhpcy5kYXRlID0gZGF0ZU9iamVjdC5nZXRVVENE
YXRlKCk7Cit9OworCitEYXkuSVNPU3RyaW5nUmVnRXhwID0gL14oXGQrKS0oXGQrKS0oXGQrKSQv
OworCisvLyBTZWUgV2ViQ29yZS9wbGF0Zm9ybS9EYXRlQ29tcG9uZW50cy5oLgorRGF5Lk1pbmlt
dW0gPSBuZXcgRGF0ZSgtNjIxMzU1OTY4MDAwMDAuMCk7CitEYXkuTWF4aW11bSA9IG5ldyBEYXRl
KDg2NDAwMDAwMDAwMDAwMDAuMCk7CisKKy8qKgorICogQHBhcmFtIHshc3RyaW5nfSBzdHIKKyAq
IEByZXR1cm4gez9Nb250aH0KICAqLwotZnVuY3Rpb24gcGFyc2VEYXRlU3RyaW5nKG9wdF9jdXJy
ZW50KSB7Ci0gICAgaWYgKG9wdF9jdXJyZW50KSB7Ci0gICAgICAgIHZhciByZXN1bHQgPSBvcHRf
Y3VycmVudC5tYXRjaCgvKFxkKyktKFxkKyktKFxkKykvKTsKLSAgICAgICAgaWYgKHJlc3VsdCkK
LSAgICAgICAgICAgIHJldHVybiBjcmVhdGVVVENEYXRlKE51bWJlcihyZXN1bHRbMV0pLCBOdW1i
ZXIocmVzdWx0WzJdKSAtIDEsIE51bWJlcihyZXN1bHRbM10pKTsKLSAgICB9CitEYXkucGFyc2Ug
PSBmdW5jdGlvbihzdHIpIHsKKyAgICB2YXIgbWF0Y2ggPSBEYXkuSVNPU3RyaW5nUmVnRXhwLmV4
ZWMoc3RyKTsKKyAgICBpZiAoIW1hdGNoKQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB2YXIg
eWVhciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CisgICAgdmFyIG1vbnRoID0gcGFyc2VJbnQo
bWF0Y2hbMl0sIDEwKSAtIDE7CisgICAgdmFyIGRhdGUgPSBwYXJzZUludChtYXRjaFszXSwgMTAp
OworICAgIHJldHVybiBuZXcgRGF5KHllYXIsIG1vbnRoLCBkYXRlKTsKK307CisvKioKKyAqIEBw
YXJhbSB7IURhdGV9IGRhdGUKKyAqIEByZXR1cm4geyFNb250aH0KKyAqLworRGF5LmNyZWF0ZUZy
b21EYXRlID0gZnVuY3Rpb24oZGF0ZSkgeworICAgIHJldHVybiBuZXcgRGF5KGRhdGUuZ2V0VVRD
RnVsbFllYXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSk7Cit9Owor
CitEYXkuY3JlYXRlRnJvbVRvZGF5ID0gZnVuY3Rpb24oKSB7CiAgICAgdmFyIG5vdyA9IG5ldyBE
YXRlKCk7Ci0gICAgLy8gQ3JlYXRlIFVUQyBkYXRlIHdpdGggc2FtZSBudW1iZXJzIGFzIGxvY2Fs
IGRhdGUuCi0gICAgcmV0dXJuIGNyZWF0ZVVUQ0RhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5n
ZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpKTsKKyAgICByZXR1cm4gbmV3IERheShub3cuZ2V0RnVs
bFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCkpOwogfQogCiAvKioKLSAqIEBw
YXJhbSB7IW51bWJlcn0geWVhcgotICogQHBhcmFtIHshbnVtYmVyfSBtb250aAotICogQHBhcmFt
IHshbnVtYmVyfSBkYXkKKyAqIEBwYXJhbSB7IURheX0gb3RoZXIKKyAqIEByZXR1cm4geyFib29s
fQorICovCitEYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7CisgICAgcmV0
dXJuIHRoaXMueWVhciA9PT0gb3RoZXIueWVhciAmJiB0aGlzLm1vbnRoID09PSBvdGhlci5tb250
aCAmJiB0aGlzLmRhdGUgPT09IG90aGVyLmRhdGU7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFE
YXl9CisgKi8KK0RheS5wcm90b3R5cGUucHJldmlvdXMgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gbmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSAtIDEpOworfTsKKwor
LyoqCisgKiBAcmV0dXJuIHshRGF5fQorICovCitEYXkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gbmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0
ZSArIDEpOworfTsKKworLyoqCisgKiBAcmV0dXJuIHshRGF0ZX0KKyAqLworRGF5LnByb3RvdHlw
ZS5zdGFydERhdGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gY3JlYXRlVVRDRGF0ZSh0aGlz
LnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSk7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFE
YXRlfQorICovCitEYXkucHJvdG90eXBlLmVuZERhdGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gY3JlYXRlVVRDRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSArIDEpOwor
fTsKKworLyoqCisgKiBAcmV0dXJuIHshbnVtYmVyfQorICovCitEYXkucHJvdG90eXBlLnZhbHVl
T2YgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zdGFydERhdGUoKS5nZXRUaW1lKCk7
Cit9OworCisvKioKICAqIEByZXR1cm4geyFzdHJpbmd9CiAgKi8KLWZ1bmN0aW9uIHNlcmlhbGl6
ZURhdGUoeWVhciwgbW9udGgsIGRheSkgewotICAgIHZhciB5ZWFyU3RyaW5nID0gU3RyaW5nKHll
YXIpOworRGF5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeworICAgIHZhciB5ZWFy
U3RyaW5nID0gU3RyaW5nKHRoaXMueWVhcik7CiAgICAgaWYgKHllYXJTdHJpbmcubGVuZ3RoIDwg
NCkKICAgICAgICAgeWVhclN0cmluZyA9ICgiMDAwIiArIHllYXJTdHJpbmcpLnN1YnN0cigtNCwg
NCk7Ci0gICAgcmV0dXJuIHllYXJTdHJpbmcgKyAiLSIgKyAoIjAiICsgKG1vbnRoICsgMSkpLnN1
YnN0cigtMiwgMikgKyAiLSIgKyAoIjAiICsgZGF5KS5zdWJzdHIoLTIsIDIpOwotfQorICAgIHJl
dHVybiB5ZWFyU3RyaW5nICsgIi0iICsgKCIwIiArICh0aGlzLm1vbnRoICsgMSkpLnN1YnN0cigt
MiwgMikgKyAiLSIgKyAoIjAiICsgdGhpcy5kYXRlKS5zdWJzdHIoLTIsIDIpOworfTsKIAogLyoq
CiAgKiBAcGFyYW0geyFudW1iZXJ8TW9udGh9IHZhbHVlT3JNb250aE9yWWVhcgpAQCAtMjIxLDEy
ICszMDgsMTIgQEAgZnVuY3Rpb24gTW9udGgodmFsdWVPck1vbnRoT3JZZWFyLCBtb250aCkgewog
ICAgICAgICB0aGlzLnllYXIgPSB2YWx1ZU9yTW9udGhPclllYXIueWVhcjsKICAgICAgICAgdGhp
cy5tb250aCA9IHZhbHVlT3JNb250aE9yWWVhci5tb250aDsKICAgICB9IGVsc2UgewotICAgICAg
ICB0aGlzLnllYXIgPSBNYXRoLmZsb29yKHZhbHVlT3JNb250aE9yWWVhciAvIDEyKSArIDE5NzA7
Ci0gICAgICAgIHRoaXMubW9udGggPSB2YWx1ZU9yTW9udGhPclllYXIgJSAxMjsKKyAgICAgICAg
dGhpcy55ZWFyID0gMTk3MDsKKyAgICAgICAgdGhpcy5tb250aCA9IHZhbHVlT3JNb250aE9yWWVh
cjsKICAgICB9CiAgICAgdGhpcy55ZWFyID0gdGhpcy55ZWFyICsgTWF0aC5mbG9vcih0aGlzLm1v
bnRoIC8gMTIpOwogICAgIHRoaXMubW9udGggPSB0aGlzLm1vbnRoIDwgMCA/IHRoaXMubW9udGgg
JSAxMiArIDEyIDogdGhpcy5tb250aCAlIDEyOwotICAgIGlmICh0aGlzLnllYXIgPCAwIHx8IE1v
bnRoLk1heGltdW0gPCB0aGlzKSB7CisgICAgaWYgKHRoaXMueWVhciA8PSAwIHx8IE1vbnRoLk1h
eGltdW0gPCB0aGlzKSB7CiAgICAgICAgIHRoaXMueWVhciA9IE5hTjsKICAgICAgICAgdGhpcy5t
b250aCA9IE5hTjsKICAgICB9CkBAIC0yOTIsNyArMzc5LDcgQEAgTW9udGgucHJvdG90eXBlLnN0
YXJ0RGF0ZSA9IGZ1bmN0aW9uKCkgewogICovCiBNb250aC5wcm90b3R5cGUuZW5kRGF0ZSA9IGZ1
bmN0aW9uKCkgewogICAgIGlmICh0aGlzLmVxdWFscyhNb250aC5NYXhpbXVtKSkKLSAgICAgICAg
cmV0dXJuIENhbGVuZGFyUGlja2VyLk1heGltdW1Qb3NzaWJsZURhdGU7CisgICAgICAgIHJldHVy
biBEYXkuTWF4aW11bS5zdGFydERhdGUoKTsKICAgICByZXR1cm4gdGhpcy5uZXh0KCkuc3RhcnRE
YXRlKCk7CiB9OwogCkBAIC00MTgsMzAgKzUwNSwzMyBAQCBmdW5jdGlvbiBDYWxlbmRhclBpY2tl
cihlbGVtZW50LCBjb25maWcpIHsKICAgICB0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemVCb3VuZCA9
IHRoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZS5iaW5kKHRoaXMpOwogICAgIHdpbmRvdy5hZGRFdmVu
dExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemVCb3VuZCwgZmFsc2Up
OwogICAgIC8vIFdlIGFzc3VtZSB0aGlzLl9jb25maWcubWluIGlzIGEgdmFsaWQgZGF0ZS4KLSAg
ICB0aGlzLm1pbmltdW1EYXRlID0gKHR5cGVvZiB0aGlzLl9jb25maWcubWluICE9PSAidW5kZWZp
bmVkIikgPyBwYXJzZURhdGVTdHJpbmcodGhpcy5fY29uZmlnLm1pbikgOiBDYWxlbmRhclBpY2tl
ci5NaW5pbXVtUG9zc2libGVEYXRlOworICAgIHRoaXMuX21pbmltdW1WYWx1ZSA9ICh0eXBlb2Yg
dGhpcy5fY29uZmlnLm1pbiAhPT0gInVuZGVmaW5lZCIpID8gcGFyc2VEYXRlU3RyaW5nKHRoaXMu
X2NvbmZpZy5taW4pLnZhbHVlT2YoKSA6IERheS5NaW5pbXVtLnZhbHVlT2YoKTsKICAgICAvLyBX
ZSBhc3N1bWUgdGhpcy5fY29uZmlnLm1heCBpcyBhIHZhbGlkIGRhdGUuCi0gICAgdGhpcy5tYXhp
bXVtRGF0ZSA9ICh0eXBlb2YgdGhpcy5fY29uZmlnLm1heCAhPT0gInVuZGVmaW5lZCIpID8gcGFy
c2VEYXRlU3RyaW5nKHRoaXMuX2NvbmZpZy5tYXgpIDogQ2FsZW5kYXJQaWNrZXIuTWF4aW11bVBv
c3NpYmxlRGF0ZTsKKyAgICB0aGlzLl9tYXhpbXVtVmFsdWUgPSAodHlwZW9mIHRoaXMuX2NvbmZp
Zy5tYXggIT09ICJ1bmRlZmluZWQiKSA/IHBhcnNlRGF0ZVN0cmluZyh0aGlzLl9jb25maWcubWF4
KS52YWx1ZU9mKCkgOiBEYXkuTWF4aW11bS52YWx1ZU9mKCk7CiAgICAgdGhpcy5zdGVwID0gKHR5
cGVvZiB0aGlzLl9jb25maWcuc3RlcCAhPT0gdW5kZWZpbmVkKSA/IE51bWJlcih0aGlzLl9jb25m
aWcuc3RlcCkgOiBDYWxlbmRhclBpY2tlci5EZWZhdWx0U3RlcFNjYWxlRmFjdG9yOwogICAgIHRo
aXMuc3RlcEJhc2UgPSAodHlwZW9mIHRoaXMuX2NvbmZpZy5zdGVwQmFzZSAhPT0gInVuZGVmaW5l
ZCIpID8gTnVtYmVyKHRoaXMuX2NvbmZpZy5zdGVwQmFzZSkgOiBDYWxlbmRhclBpY2tlci5EZWZh
dWx0U3RlcEJhc2U7Ci0gICAgdGhpcy55ZWFyTW9udGhDb250cm9sbGVyID0gbmV3IFllYXJNb250
aENvbnRyb2xsZXIodGhpcyk7Ci0gICAgdGhpcy5kYXlzVGFibGUgPSBuZXcgRGF5c1RhYmxlKHRo
aXMpOworICAgIHRoaXMuX21pbmltdW1Nb250aCA9IE1vbnRoLmNyZWF0ZUZyb21EYXRlKG5ldyBE
YXRlKHRoaXMuX21pbmltdW1WYWx1ZSkpOworICAgIHRoaXMubWF4aW11bU1vbnRoID0gTW9udGgu
Y3JlYXRlRnJvbURhdGUobmV3IERhdGUodGhpcy5fbWF4aW11bVZhbHVlKSk7CisgICAgdGhpcy5f
Y3VycmVudE1vbnRoID0gbmV3IE1vbnRoKE5hTiwgTmFOKTsKKyAgICB0aGlzLl95ZWFyTW9udGhD
b250cm9sbGVyID0gbmV3IFllYXJNb250aENvbnRyb2xsZXIodGhpcyk7CisgICAgdGhpcy5fZGF5
c1RhYmxlID0gbmV3IERheXNUYWJsZSh0aGlzKTsKICAgICB0aGlzLl9oYWRLZXlFdmVudCA9IGZh
bHNlOwogICAgIHRoaXMuX2xheW91dCgpOwotICAgIHZhciBpbml0aWFsRGF0ZSA9IHBhcnNlRGF0
ZVN0cmluZyh0aGlzLl9jb25maWcuY3VycmVudFZhbHVlKTsKLSAgICBpZiAoaW5pdGlhbERhdGUg
PCB0aGlzLm1pbmltdW1EYXRlKQotICAgICAgICBpbml0aWFsRGF0ZSA9IHRoaXMubWluaW11bURh
dGU7Ci0gICAgZWxzZSBpZiAoaW5pdGlhbERhdGUgPiB0aGlzLm1heGltdW1EYXRlKQotICAgICAg
ICBpbml0aWFsRGF0ZSA9IHRoaXMubWF4aW11bURhdGU7Ci0gICAgdGhpcy5kYXlzVGFibGUuc2Vs
ZWN0RGF0ZShpbml0aWFsRGF0ZSk7CisgICAgdmFyIGluaXRpYWxTZWxlY3Rpb24gPSBwYXJzZURh
dGVTdHJpbmcodGhpcy5fY29uZmlnLmN1cnJlbnRWYWx1ZSk7CisgICAgaWYgKCFpbml0aWFsU2Vs
ZWN0aW9uKQorICAgICAgICBpbml0aWFsU2VsZWN0aW9uID0gRGF5LmNyZWF0ZUZyb21Ub2RheSgp
OworICAgIGlmIChpbml0aWFsU2VsZWN0aW9uLnZhbHVlT2YoKSA8IHRoaXMuX21pbmltdW1WYWx1
ZSkKKyAgICAgICAgaW5pdGlhbFNlbGVjdGlvbiA9IG5ldyBEYXkodGhpcy5fbWluaW11bVZhbHVl
KTsKKyAgICBlbHNlIGlmIChpbml0aWFsU2VsZWN0aW9uLnZhbHVlT2YoKSA+IHRoaXMuX21heGlt
dW1WYWx1ZSkKKyAgICAgICAgaW5pdGlhbFNlbGVjdGlvbiA9IG5ldyBEYXkodGhpcy5fbWF4aW11
bVZhbHVlKTsKKyAgICB0aGlzLnNob3dNb250aChNb250aC5jcmVhdGVGcm9tRGF0ZShpbml0aWFs
U2VsZWN0aW9uLnN0YXJ0RGF0ZSgpKSwgZmFsc2UpOworICAgIHRoaXMuX2RheXNUYWJsZS5zZWxl
Y3RSYW5nZShpbml0aWFsU2VsZWN0aW9uKTsKICAgICB0aGlzLmZpeFdpbmRvd1NpemUoKTsKICAg
ICB0aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJvdW5kID0gdGhpcy5faGFuZGxlQm9keUtleURvd24u
YmluZCh0aGlzKTsKICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24i
LCB0aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJvdW5kLCBmYWxzZSk7CiB9CiBDYWxlbmRhclBpY2tl
ci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFBpY2tlci5wcm90b3R5cGUpOwogCi0vLyBIYXJk
IGxpbWl0cyBvZiB0eXBlPWRhdGUuIFNlZSBXZWJDb3JlL3BsYXRmb3JtL0RhdGVDb21wb25lbnRz
LmguCi1DYWxlbmRhclBpY2tlci5NaW5pbXVtUG9zc2libGVEYXRlID0gbmV3IERhdGUoLTYyMTM1
NTk2ODAwMDAwLjApOwotQ2FsZW5kYXJQaWNrZXIuTWF4aW11bVBvc3NpYmxlRGF0ZSA9IG5ldyBE
YXRlKDg2NDAwMDAwMDAwMDAwMDAuMCk7CiAvLyBTZWUgV2ViQ29yZS9odG1sL0RhdGVJbnB1dFR5
cGUuY3BwLgogQ2FsZW5kYXJQaWNrZXIuRGVmYXVsdFN0ZXBTY2FsZUZhY3RvciA9IDg2NDAwMDAw
OwogQ2FsZW5kYXJQaWNrZXIuRGVmYXVsdFN0ZXBCYXNlID0gMC4wOwpAQCAtNDU3LDE3ICs1NDcs
MTcgQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbigpIHsKIENh
bGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0ID0gZnVuY3Rpb24oKSB7CiAgICAgaWYgKHRo
aXMuX2NvbmZpZy5pc0NhbGVuZGFyUlRMKQogICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlz
dC5hZGQoInJ0bCIpOwotICAgIHRoaXMueWVhck1vbnRoQ29udHJvbGxlci5hdHRhY2hUbyh0aGlz
Ll9lbGVtZW50KTsKLSAgICB0aGlzLmRheXNUYWJsZS5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsK
KyAgICB0aGlzLl95ZWFyTW9udGhDb250cm9sbGVyLmF0dGFjaFRvKHRoaXMuX2VsZW1lbnQpOwor
ICAgIHRoaXMuX2RheXNUYWJsZS5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsKICAgICB0aGlzLl9s
YXlvdXRCdXR0b25zKCk7CiAgICAgLy8gRGF5c1RhYmxlIHdpbGwgaGF2ZSBmb2N1cyBidXQgd2Ug
ZG9uJ3Qgd2FudCB0byBzaG93IGl0cyBmb2N1cyByaW5nIHVudGlsIHRoZSBmaXJzdCBrZXkgZXZl
bnQuCiAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZXMuTm9Gb2N1c1Jp
bmcpOwogfTsKIAogQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmhhbmRsZVRvZGF5ID0gZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgIHRoaXMuZGF5c1RhYmxlLnNl
bGVjdERhdGUoZGF0ZSk7Ci0gICAgdGhpcy5zdWJtaXRWYWx1ZShzZXJpYWxpemVEYXRlKGRhdGUu
Z2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkpOworICAgIHZh
ciB0b2RheSA9IERheS5jcmVhdGVGcm9tVG9kYXkoKTsKKyAgICB0aGlzLl9kYXlzVGFibGUuc2Vs
ZWN0UmFuZ2UodG9kYXkpOworICAgIHRoaXMuc3VibWl0VmFsdWUodG9kYXkudG9TdHJpbmcoKSk7
CiB9OwogCiBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuaGFuZGxlQ2xlYXIgPSBmdW5jdGlvbigp
IHsKQEAgLTUyOCw2ICs2MTgsMzggQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9sYXlvdXRC
dXR0b25zID0gZnVuY3Rpb24oKSB7CiAgICAgdGhpcy5sYXN0Rm9jdXNhYmxlQ29udHJvbCA9IHRo
aXMuY2xlYXIgfHwgdGhpcy50b2RheTsKIH07CiAKKy8qKgorICogQHBhcmFtIHshTW9udGh9IG1v
bnRoCisgKiBAcmV0dXJuIHshYm9vbH0KKyAqLworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNo
b3VsZFNob3dNb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7CisgICAgcmV0dXJuIHRoaXMuX21pbmlt
dW1Nb250aC52YWx1ZU9mKCkgPD0gbW9udGgudmFsdWVPZigpICYmIHRoaXMubWF4aW11bU1vbnRo
LnZhbHVlT2YoKSA+PSBtb250aC52YWx1ZU9mKCk7Cit9OworCisvKioKKyAqIEBwYXJhbSB7IU1v
bnRofSBtb250aAorICogQHBhcmFtIHshYm9vbH0gYW5pbWF0ZQorICogQHBhcmFtIHshYm9vbH0g
a2VlcFNlbGVjdGlvblBvc2l0aW9uCisgKi8KK0NhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5zaG93
TW9udGggPSBmdW5jdGlvbihtb250aCwgYW5pbWF0ZSwga2VlcFNlbGVjdGlvblBvc2l0aW9uKSB7
CisgICAgaWYgKHRoaXMuX2N1cnJlbnRNb250aC5lcXVhbHMobW9udGgpKQorICAgICAgICByZXR1
cm47CisgICAgZWxzZSBpZiAobW9udGgudmFsdWVPZigpIDwgdGhpcy5fbWluaW11bU1vbnRoLnZh
bHVlT2YoKSkKKyAgICAgICAgbW9udGggPSB0aGlzLl9taW5pbXVtTW9udGg7CisgICAgZWxzZSBp
ZiAobW9udGgudmFsdWVPZigpID4gdGhpcy5tYXhpbXVtTW9udGgudmFsdWVPZigpKQorICAgICAg
ICBtb250aCA9IHRoaXMubWF4aW11bU1vbnRoOworICAgIHRoaXMuX3llYXJNb250aENvbnRyb2xs
ZXIuc2V0TW9udGgobW9udGgpOworICAgIHRoaXMuX2RheXNUYWJsZS5uYXZpZ2F0ZVRvTW9udGgo
bW9udGgsIGFuaW1hdGUsIGtlZXBTZWxlY3Rpb25Qb3NpdGlvbik7CisgICAgdGhpcy5fY3VycmVu
dE1vbnRoID0gbW9udGg7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFNb250aH0KKyAqLworQ2Fs
ZW5kYXJQaWNrZXIucHJvdG90eXBlLmN1cnJlbnRNb250aCA9IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLl9jdXJyZW50TW9udGg7Cit9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qKgpAQCAtNTM2
LDEwICs2NTgsNiBAQCBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX2xheW91dEJ1dHRvbnMgPSBm
dW5jdGlvbigpIHsKICAqLwogZnVuY3Rpb24gWWVhck1vbnRoQ29udHJvbGxlcihwaWNrZXIpIHsK
ICAgICB0aGlzLnBpY2tlciA9IHBpY2tlcjsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7P01vbnRo
fQotICAgICAqLwotICAgIHRoaXMuX2N1cnJlbnRNb250aCA9IG51bGw7CiB9CiAKIC8qKgpAQCAt
NTc2LDE0ICs2OTQsMTIgQEAgWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuYXR0YWNoVG8g
PSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgdGhpcy5fd2FsbC5hZGRFdmVudExpc3RlbmVyKCJj
bGljayIsIHRoaXMuX2Nsb3NlUG9wdXAuYmluZCh0aGlzKSwgZmFsc2UpOwogICAgIGVsZW1lbnQu
YXBwZW5kQ2hpbGQodGhpcy5fd2FsbCk7CiAKLSAgICB2YXIgbWF4aW11bVllYXIgPSB0aGlzLnBp
Y2tlci5tYXhpbXVtRGF0ZS5nZXRVVENGdWxsWWVhcigpOwotICAgIC8vIEJlY2F1c2UgdGhlIG1h
eGltdW0gcG9zc2libGUgeWVhciBpcyBTZXB0ZW1iZXIgd2Ugc2hvdWxkIHVzZSB0aGUgeWVhciBi
ZWZvcmUgaXQuCi0gICAgaWYgKG1heGltdW1ZZWFyID09PSBNb250aC5NYXhpbXVtLnllYXIpCi0g
ICAgICAgIG1heGltdW1ZZWFyLS07CisgICAgdmFyIG1vbnRoID0gdGhpcy5waWNrZXIubWF4aW11
bU1vbnRoOwogICAgIHZhciBtYXhXaWR0aCA9IDA7CiAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCAx
MjsgKyttKSB7Ci0gICAgICAgIHRoaXMuX21vbnRoLnRleHRDb250ZW50ID0gbmV3IE1vbnRoKG1h
eGltdW1ZZWFyLCBtKS50b0xvY2FsZVN0cmluZygpOworICAgICAgICB0aGlzLl9tb250aC50ZXh0
Q29udGVudCA9IG1vbnRoLnRvTG9jYWxlU3RyaW5nKCk7CiAgICAgICAgIG1heFdpZHRoID0gTWF0
aC5tYXgobWF4V2lkdGgsIHRoaXMuX21vbnRoLm9mZnNldFdpZHRoKTsKKyAgICAgICAgbW9udGgg
PSBtb250aC5wcmV2aW91cygpOwogICAgIH0KICAgICBpZiAoZ2V0TGFuZ3VhZ2UoKSA9PSAiamEi
ICYmIEltcGVyaWFsRXJhTGltaXQgPCBtYXhpbXVtWWVhcikgewogICAgICAgICBmb3IgKHZhciBt
ID0gMDsgbSA8IDEyOyArK20pIHsKQEAgLTY1NCw0NCArNzcwLDMwIEBAIFllYXJNb250aENvbnRy
b2xsZXIucHJvdG90eXBlLl9hdHRhY2hSaWdodEJ1dHRvbnNUbyA9IGZ1bmN0aW9uKHBhcmVudCkg
ewogfTsKIAogLyoqCi0gKiBAcmV0dXJuIHs/TW9udGh9Ci0gKi8KLVllYXJNb250aENvbnRyb2xs
ZXIucHJvdG90eXBlLm1vbnRoID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuX2N1cnJl
bnRNb250aDsKLX07Ci0KLS8qKgogICogQHBhcmFtIHshTW9udGh9IG1vbnRoCiAgKi8KIFllYXJN
b250aENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vbnRoID0gZnVuY3Rpb24obW9udGgpIHsKLSAg
ICB0aGlzLl9jdXJyZW50TW9udGggPSBuZXcgTW9udGgobW9udGgpOwotICAgIHRoaXMuX3JlZHJh
dygpOwotfTsKLQotWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX3JlZHJhdyA9IGZ1bmN0
aW9uKCkgewotICAgIHZhciBtaW4gPSBNb250aC5jcmVhdGVGcm9tRGF0ZSh0aGlzLnBpY2tlci5t
aW5pbXVtRGF0ZSkudmFsdWVPZigpOwotICAgIHZhciBtYXggPSBNb250aC5jcmVhdGVGcm9tRGF0
ZSh0aGlzLnBpY2tlci5tYXhpbXVtRGF0ZSkudmFsdWVPZigpOwotICAgIHZhciBjdXJyZW50ID0g
dGhpcy5fY3VycmVudE1vbnRoLnZhbHVlT2YoKTsKKyAgICB2YXIgbW9udGhWYWx1ZSA9IG1vbnRo
LnZhbHVlT2YoKTsKICAgICBpZiAodGhpcy5fbGVmdDMpCi0gICAgICAgIHRoaXMuX2xlZnQzLmRp
c2FibGVkID0gY3VycmVudCAtIDEzIDwgbWluOwotICAgIHRoaXMuX2xlZnQyLmRpc2FibGVkID0g
Y3VycmVudCAtIDIgPCBtaW47Ci0gICAgdGhpcy5fbGVmdDEuZGlzYWJsZWQgPSBjdXJyZW50IC0g
MSA8IG1pbjsKLSAgICB0aGlzLl9yaWdodDEuZGlzYWJsZWQgPSBjdXJyZW50ICsgMSA+IG1heDsK
LSAgICB0aGlzLl9yaWdodDIuZGlzYWJsZWQgPSBjdXJyZW50ICsgMiA+IG1heDsKKyAgICAgICAg
dGhpcy5fbGVmdDMuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuc2hvdWxkU2hvd01vbnRoKG5ldyBN
b250aChtb250aFZhbHVlIC0gMTMpKTsKKyAgICB0aGlzLl9sZWZ0Mi5kaXNhYmxlZCA9ICF0aGlz
LnBpY2tlci5zaG91bGRTaG93TW9udGgobmV3IE1vbnRoKG1vbnRoVmFsdWUgLSAyKSk7CisgICAg
dGhpcy5fbGVmdDEuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuc2hvdWxkU2hvd01vbnRoKG5ldyBN
b250aChtb250aFZhbHVlIC0gMSkpOworICAgIHRoaXMuX3JpZ2h0MS5kaXNhYmxlZCA9ICF0aGlz
LnBpY2tlci5zaG91bGRTaG93TW9udGgobmV3IE1vbnRoKG1vbnRoVmFsdWUgKyAxKSk7CisgICAg
dGhpcy5fcmlnaHQyLmRpc2FibGVkID0gIXRoaXMucGlja2VyLnNob3VsZFNob3dNb250aChuZXcg
TW9udGgobW9udGhWYWx1ZSArIDIpKTsKICAgICBpZiAodGhpcy5fcmlnaHQzKQotICAgICAgICB0
aGlzLl9yaWdodDMuZGlzYWJsZWQgPSBjdXJyZW50ICsgMTMgPiBtYXg7Ci0gICAgdGhpcy5fbW9u
dGguaW5uZXJUZXh0ID0gdGhpcy5fY3VycmVudE1vbnRoLnRvTG9jYWxlU3RyaW5nKCk7CisgICAg
ICAgIHRoaXMuX2xlZnQzLmRpc2FibGVkID0gIXRoaXMucGlja2VyLnNob3VsZFNob3dNb250aChu
ZXcgTW9udGgobW9udGhWYWx1ZSArIDEzKSk7CisgICAgdGhpcy5fbW9udGguaW5uZXJUZXh0ID0g
bW9udGgudG9Mb2NhbGVTdHJpbmcoKTsKICAgICB3aGlsZSAodGhpcy5fbW9udGhQb3B1cENvbnRl
bnRzLmhhc0NoaWxkTm9kZXMoKSkKICAgICAgICAgdGhpcy5fbW9udGhQb3B1cENvbnRlbnRzLnJl
bW92ZUNoaWxkKHRoaXMuX21vbnRoUG9wdXBDb250ZW50cy5maXJzdENoaWxkKTsKIAotICAgIGZv
ciAodmFyIG0gPSBjdXJyZW50IC0gNjsgbSA8PSBjdXJyZW50ICsgNjsgbSsrKSB7Ci0gICAgICAg
IGlmIChtIDwgbWluIHx8IG0gPiBtYXgpCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3Ig
KHZhciBtID0gbW9udGhWYWx1ZSAtIDY7IG0gPD0gbW9udGhWYWx1ZSArIDY7IG0rKykgewogICAg
ICAgICB2YXIgbW9udGggPSBuZXcgTW9udGgobSk7CisgICAgICAgIGlmICghdGhpcy5waWNrZXIu
c2hvdWxkU2hvd01vbnRoKG1vbnRoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB2
YXIgb3B0aW9uID0gY3JlYXRlRWxlbWVudCgiZGl2IiwgQ2xhc3NOYW1lcy5Nb250aFNlbGVjdG9y
UG9wdXBFbnRyeSwgbW9udGgudG9Mb2NhbGVTdHJpbmcoKSk7CiAgICAgICAgIG9wdGlvbi5kYXRh
c2V0LnZhbHVlID0gbW9udGgudG9TdHJpbmcoKTsKICAgICAgICAgdGhpcy5fbW9udGhQb3B1cENv
bnRlbnRzLmFwcGVuZENoaWxkKG9wdGlvbik7Ci0gICAgICAgIGlmIChtID09IGN1cnJlbnQpCisg
ICAgICAgIGlmIChtID09IG1vbnRoVmFsdWUpCiAgICAgICAgICAgICBvcHRpb24uY2xhc3NMaXN0
LmFkZChDbGFzc05hbWVzLlNlbGVjdGVkTW9udGhZZWFyKTsKICAgICB9CiB9OwpAQCAtODEwLDcg
KzkxMiw3IEBAIFllYXJNb250aENvbnRyb2xsZXIucHJvdG90eXBlLl9oYW5kbGVZZWFyTW9udGhD
aGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0
aW9uKCk7CiAgICAgaWYgKCFzZWxlY3Rpb24pCiAgICAgICAgIHJldHVybjsKLSAgICB0aGlzLnBp
Y2tlci5kYXlzVGFibGUubmF2aWdhdGVUb01vbnRoQW5kS2VlcFNlbGVjdGlvblBvc2l0aW9uKE1v
bnRoLnBhcnNlKHNlbGVjdGlvbi5kYXRhc2V0LnZhbHVlKSk7CisgICAgdGhpcy5waWNrZXIuc2hv
d01vbnRoKE1vbnRoLnBhcnNlKHNlbGVjdGlvbi5kYXRhc2V0LnZhbHVlKSk7CiB9OwogCiAvKgpA
QCAtODY4LDE3ICs5NzAsOSBAQCBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5faGFuZGxl
QnV0dG9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCkgewogICogQHBhcmFtIHshbnVtYmVyfSBhbW91
bnQKICAqLwogWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUubW92ZVJlbGF0aXZlbHkgPSBm
dW5jdGlvbihhbW91bnQpIHsKLSAgICB2YXIgbWluID0gTW9udGguY3JlYXRlRnJvbURhdGUodGhp
cy5waWNrZXIubWluaW11bURhdGUpLnZhbHVlT2YoKTsKLSAgICB2YXIgbWF4ID0gTW9udGguY3Jl
YXRlRnJvbURhdGUodGhpcy5waWNrZXIubWF4aW11bURhdGUpLnZhbHVlT2YoKTsKLSAgICB2YXIg
Y3VycmVudCA9IHRoaXMuX2N1cnJlbnRNb250aC52YWx1ZU9mKCk7Ci0gICAgdmFyIHVwZGF0ZWQg
PSBjdXJyZW50OwotICAgIGlmIChhbW91bnQgPCAwKQotICAgICAgICB1cGRhdGVkID0gY3VycmVu
dCArIGFtb3VudCA+PSBtaW4gPyBjdXJyZW50ICsgYW1vdW50IDogbWluOwotICAgIGVsc2UKLSAg
ICAgICAgdXBkYXRlZCA9IGN1cnJlbnQgKyBhbW91bnQgPD0gbWF4ID8gY3VycmVudCArIGFtb3Vu
dCA6IG1heDsKLSAgICBpZiAodXBkYXRlZCA9PSBjdXJyZW50KQotICAgICAgICByZXR1cm47Ci0g
ICAgdGhpcy5waWNrZXIuZGF5c1RhYmxlLm5hdmlnYXRlVG9Nb250aEFuZEtlZXBTZWxlY3Rpb25Q
b3NpdGlvbihuZXcgTW9udGgodXBkYXRlZCkpOworICAgIHZhciBjdXJyZW50ID0gdGhpcy5waWNr
ZXIuY3VycmVudE1vbnRoKCkudmFsdWVPZigpOworICAgIHZhciB1cGRhdGVkID0gbmV3IE1vbnRo
KGN1cnJlbnQgKyBhbW91bnQpOworICAgIHRoaXMucGlja2VyLnNob3dNb250aCh1cGRhdGVkLCB0
cnVlLCB0cnVlKTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTg4OSwxMCArOTgzLDYgQEAgWWVhck1v
bnRoQ29udHJvbGxlci5wcm90b3R5cGUubW92ZVJlbGF0aXZlbHkgPSBmdW5jdGlvbihhbW91bnQp
IHsKICAqLwogZnVuY3Rpb24gRGF5c1RhYmxlKHBpY2tlcikgewogICAgIHRoaXMucGlja2VyID0g
cGlja2VyOwotICAgIC8qKgotICAgICAqIEB0eXBlIHs/TW9udGh9Ci0gICAgICovCi0gICAgdGhp
cy5fY3VycmVudE1vbnRoID0gbnVsbDsKIH0KIAogLyoqCkBAIC05NDcsMzYgKzEwMzcsMzUgQEAg
RGF5c1RhYmxlLnByb3RvdHlwZS5hdHRhY2hUbyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKIH07CiAK
IC8qKgotICogQHBhcmFtIHshbnVtYmVyfSB0aW1lIGRhdGUgaW4gbWlsbGlzZWNvbmQuCisgKiBA
cGFyYW0geyFudW1iZXJ9IHZhbHVlCiAgKiBAcmV0dXJuIHshYm9vbGVhbn0KICAqLwotQ2FsZW5k
YXJQaWNrZXIucHJvdG90eXBlLnN0ZXBNaXNtYXRjaCA9IGZ1bmN0aW9uKHRpbWUpIHsKLSAgICBy
ZXR1cm4gKHRpbWUgLSB0aGlzLnN0ZXBCYXNlKSAlIHRoaXMuc3RlcCAhPSAwOworQ2FsZW5kYXJQ
aWNrZXIucHJvdG90eXBlLl9zdGVwTWlzbWF0Y2ggPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJl
dHVybiAodmFsdWUgLSB0aGlzLnN0ZXBCYXNlKSAlIHRoaXMuc3RlcCAhPSAwOwogfQogCiAvKioK
LSAqIEBwYXJhbSB7IW51bWJlcn0gdGltZSBkYXRlIGluIG1pbGxpc2Vjb25kLgorICogQHBhcmFt
IHshbnVtYmVyfSB2YWx1ZQogICogQHJldHVybiB7IWJvb2xlYW59CiAgKi8KLUNhbGVuZGFyUGlj
a2VyLnByb3RvdHlwZS5vdXRPZlJhbmdlID0gZnVuY3Rpb24odGltZSkgewotICAgIHJldHVybiB0
aW1lIDwgdGhpcy5taW5pbXVtRGF0ZS5nZXRUaW1lKCkgfHwgdGltZSA+IHRoaXMubWF4aW11bURh
dGUuZ2V0VGltZSgpOworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9vdXRPZlJhbmdlID0gZnVu
Y3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPCB0aGlzLl9taW5pbXVtVmFsdWUgfHwg
dmFsdWUgPiB0aGlzLl9tYXhpbXVtVmFsdWU7CiB9CiAKIC8qKgotICogQHBhcmFtIHshbnVtYmVy
fSB0aW1lIGRhdGUgaW4gbWlsbGlzZWNvbmQuCisgKiBAcGFyYW0geyFNb250aHxEYXl9IHJhbmdl
CiAgKiBAcmV0dXJuIHshYm9vbGVhbn0KICAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmlz
VmFsaWREYXRlID0gZnVuY3Rpb24odGltZSkgewotICAgIHJldHVybiAhdGhpcy5vdXRPZlJhbmdl
KHRpbWUpICYmICF0aGlzLnN0ZXBNaXNtYXRjaCh0aW1lKTsKK0NhbGVuZGFyUGlja2VyLnByb3Rv
dHlwZS5pc1ZhbGlkRGF0ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CisgICAgdmFyIHZhbHVlID0gcmFu
Z2UudmFsdWVPZigpOworICAgIHJldHVybiAhdGhpcy5fb3V0T2ZSYW5nZSh2YWx1ZSkgJiYgIXRo
aXMuX3N0ZXBNaXNtYXRjaCh2YWx1ZSk7CiB9CiAKIC8qKgotICogQHBhcmFtIHshbnVtYmVyfSB5
ZWFyCi0gKiBAcGFyYW0geyFudW1iZXJ9IG1vbnRoCisgKiBAcGFyYW0geyFNb250aH0gbW9udGgK
ICAqLwogRGF5c1RhYmxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGggPSBmdW5jdGlvbihtb250aCkg
ewotICAgIHRoaXMuX2N1cnJlbnRNb250aCA9IG5ldyBNb250aChtb250aCk7Ci0gICAgdmFyIGRh
eUl0ZXJhdG9yID0gdGhpcy5fY3VycmVudE1vbnRoLnN0YXJ0RGF0ZSgpOworICAgIHZhciBkYXlJ
dGVyYXRvciA9IG1vbnRoLnN0YXJ0RGF0ZSgpOwogICAgIHZhciBtb250aFN0YXJ0RGF5ID0gZGF5
SXRlcmF0b3IuZ2V0VVRDRGF5KCk7CiAgICAgdmFyIHdlZWtTdGFydERheSA9IGdsb2JhbC5wYXJh
bXMud2Vla1N0YXJ0RGF5IHx8IDA7CiAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gd2Vla1N0YXJ0RGF5
IC0gbW9udGhTdGFydERheTsKQEAgLTk5MCwxNSArMTA3OSwxMyBAQCBEYXlzVGFibGUucHJvdG90
eXBlLl9yZW5kZXJNb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7CiAgICAgICAgICAgICB2YXIgZWxl
bWVudCA9IHRoaXMuX2RheXNbd11bZF07CiAgICAgICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9
IGxvY2FsaXplTnVtYmVyKGRheUl0ZXJhdG9yLmdldFVUQ0RhdGUoKSk7CiAgICAgICAgICAgICBl
bGVtZW50LmNsYXNzTmFtZSA9IENsYXNzTmFtZXMuRGF5OwotICAgICAgICAgICAgZWxlbWVudC5k
YXRhc2V0LnN1Ym1pdFZhbHVlID0gc2VyaWFsaXplRGF0ZShpdGVyTW9udGgueWVhciwgaXRlck1v
bnRoLm1vbnRoLCBkYXlJdGVyYXRvci5nZXRVVENEYXRlKCkpOworICAgICAgICAgICAgZWxlbWVu
dC5kYXRhc2V0LnN1Ym1pdFZhbHVlID0gRGF5LmNyZWF0ZUZyb21EYXRlKGRheUl0ZXJhdG9yKS50
b1N0cmluZygpOwogICAgICAgICAgICAgaWYgKGlzTmFOKHRpbWUpKSB7CiAgICAgICAgICAgICAg
ICAgZWxlbWVudC5pbm5lclRleHQgPSAiLSI7CiAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFz
c0xpc3QuYWRkKENsYXNzTmFtZXMuVW5hdmFpbGFibGUpOwotICAgICAgICAgICAgfSBlbHNlIGlm
ICh0aGlzLnBpY2tlci5vdXRPZlJhbmdlKHRpbWUpKQotICAgICAgICAgICAgICAgIGVsZW1lbnQu
Y2xhc3NMaXN0LmFkZChDbGFzc05hbWVzLlVuYXZhaWxhYmxlKTsKLSAgICAgICAgICAgIGVsc2Ug
aWYgKHRoaXMucGlja2VyLnN0ZXBNaXNtYXRjaCh0aW1lKSkKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIXRoaXMucGlja2VyLmlzVmFsaWREYXRlKERheS5jcmVhdGVGcm9tRGF0ZShkYXlJdGVyYXRv
cikpKQogICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDbGFzc05hbWVzLlVu
YXZhaWxhYmxlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFpdGVyTW9udGguZXF1YWxzKHRoaXMu
X2N1cnJlbnRNb250aCkpIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFpdGVyTW9udGguZXF1YWxz
KG1vbnRoKSkgewogICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDbGFzc05h
bWVzLkF2YWlsYWJsZSk7CiAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENs
YXNzTmFtZXMuTm90VGhpc01vbnRoKTsKICAgICAgICAgICAgIH0gZWxzZQpAQCAtMTAwNywzMSAr
MTA5NCwyOCBAQCBEYXlzVGFibGUucHJvdG90eXBlLl9yZW5kZXJNb250aCA9IGZ1bmN0aW9uKG1v
bnRoKSB7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB0aGlzLnBpY2tlci50b2RheS5kaXNhYmxl
ZCA9ICF0aGlzLnBpY2tlci5pc1ZhbGlkRGF0ZShwYXJzZURhdGVTdHJpbmcoKS5nZXRUaW1lKCkp
OworICAgIHRoaXMucGlja2VyLnRvZGF5LmRpc2FibGVkID0gIXRoaXMucGlja2VyLmlzVmFsaWRE
YXRlKERheS5jcmVhdGVGcm9tVG9kYXkoKS52YWx1ZU9mKCkpOwogfTsKIAogLyoqCiAgKiBAcGFy
YW0geyFNb250aH0gbW9udGgKKyAqIEBwYXJhbSB7IWJvb2x9IGFuaW1hdGUKKyAqIEBwYXJhbSB7
IWJvb2x9IGtlZXBTZWxlY3Rpb25Qb3NpdGlvbgogICovCi1EYXlzVGFibGUucHJvdG90eXBlLl9u
YXZpZ2F0ZVRvTW9udGggPSBmdW5jdGlvbihtb250aCkgewotICAgIHRoaXMucGlja2VyLnllYXJN
b250aENvbnRyb2xsZXIuc2V0TW9udGgobW9udGgpOwotICAgIHRoaXMuX3JlbmRlck1vbnRoKG1v
bnRoKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshTW9udGh9IG1vbnRoCi0gKi8KLURheXNUYWJs
ZS5wcm90b3R5cGUuX25hdmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24gPSBmdW5jdGlvbihtb250
aCkgewotICAgIGlmICh0aGlzLl9jdXJyZW50TW9udGgpIHsKLSAgICAgICAgdmFyIGRlbHRhID0g
dGhpcy5fY3VycmVudE1vbnRoLnZhbHVlT2YoKSAtIG1vbnRoLnZhbHVlT2YoKTsKLSAgICAgICAg
aWYgKGRlbHRhID09PSAwKQotICAgICAgICAgICAgcmV0dXJuOworRGF5c1RhYmxlLnByb3RvdHlw
ZS5uYXZpZ2F0ZVRvTW9udGggPSBmdW5jdGlvbihtb250aCwgYW5pbWF0ZSwga2VlcFNlbGVjdGlv
blBvc2l0aW9uKSB7CisgICAgdmFyIGZpcnN0Tm9kZUluU2VsZWN0ZWRSYW5nZSA9IHRoaXMuX2Zp
cnN0Tm9kZUluU2VsZWN0ZWRSYW5nZSgpOworICAgIGlmIChhbmltYXRlKSB7CiAgICAgICAgIHZh
ciBkYXlzU3R5bGUgPSB0aGlzLl9kYXlzQ29udGFpbmVyLnN0eWxlOwogICAgICAgICBkYXlzU3R5
bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgICAgICBkYXlzU3R5bGUud2Via2l0VHJhbnNp
dGlvbiA9ICJsZWZ0IDAuMXMgZWFzZSI7Ci0gICAgICAgIGRheXNTdHlsZS5sZWZ0ID0gKGRlbHRh
ID4gMCA/ICIiIDogIi0iKSArIHRoaXMuX2RheXNDb250YWluZXIub2Zmc2V0V2lkdGggKyAicHgi
OworICAgICAgICBkYXlzU3R5bGUubGVmdCA9ICh0aGlzLnBpY2tlci5jdXJyZW50TW9udGgoKS52
YWx1ZU9mKCkgPiBtb250aC52YWx1ZU9mKCkgPyAiIiA6ICItIikgKyB0aGlzLl9kYXlzQ29udGFp
bmVyLm9mZnNldFdpZHRoICsgInB4IjsKKyAgICB9CisgICAgdGhpcy5fcmVuZGVyTW9udGgobW9u
dGgpOworICAgIGlmIChrZWVwU2VsZWN0aW9uUG9zaXRpb24gJiYgZmlyc3ROb2RlSW5TZWxlY3Rl
ZFJhbmdlKSB7CisgICAgICAgIHZhciB4ID0gcGFyc2VJbnQoZmlyc3ROb2RlSW5TZWxlY3RlZFJh
bmdlLmRhdGFzZXQucG9zaXRpb25YLCAxMCk7CisgICAgICAgIHZhciB5ID0gcGFyc2VJbnQoZmly
c3ROb2RlSW5TZWxlY3RlZFJhbmdlLmRhdGFzZXQucG9zaXRpb25ZLCAxMCk7CisgICAgICAgIHRo
aXMuX3NlbGVjdFJhbmdlQXRQb3NpdGlvbih4LCB5KTsKICAgICB9Ci0gICAgdGhpcy5fbmF2aWdh
dGVUb01vbnRoKG1vbnRoKTsKIH07CiAKIERheXNUYWJsZS5wcm90b3R5cGUuX21vdmVJbkRheXMg
PSBmdW5jdGlvbigpIHsKQEAgLTEwNDYsMjcgKzExMzAsMTIgQEAgRGF5c1RhYmxlLnByb3RvdHlw
ZS5fbW92ZUluRGF5cyA9IGZ1bmN0aW9uKCkgewogfTsKIAogLyoqCi0gKiBAcGFyYW0geyFNb250
aH0gbW9udGgKLSAqLwotRGF5c1RhYmxlLnByb3RvdHlwZS5uYXZpZ2F0ZVRvTW9udGhBbmRLZWVw
U2VsZWN0aW9uUG9zaXRpb24gPSBmdW5jdGlvbihtb250aCkgewotICAgIGlmICh0aGlzLl9jdXJy
ZW50TW9udGguZXF1YWxzKG1vbnRoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHZhciBmaXJzdE5v
ZGVJblNlbGVjdGVkUmFuZ2UgPSB0aGlzLl9maXJzdE5vZGVJblNlbGVjdGVkUmFuZ2UoKTsKLSAg
ICB0aGlzLl9uYXZpZ2F0ZVRvTW9udGhXaXRoQW5pbWF0aW9uKG1vbnRoKTsKLSAgICBpZiAoZmly
c3ROb2RlSW5TZWxlY3RlZFJhbmdlKSB7Ci0gICAgICAgIHZhciB4ID0gcGFyc2VJbnQoZmlyc3RO
b2RlSW5TZWxlY3RlZFJhbmdlLmRhdGFzZXQucG9zaXRpb25YLCAxMCk7Ci0gICAgICAgIHZhciB5
ID0gcGFyc2VJbnQoZmlyc3ROb2RlSW5TZWxlY3RlZFJhbmdlLmRhdGFzZXQucG9zaXRpb25ZLCAx
MCk7Ci0gICAgICAgIHRoaXMuX3NlbGVjdFJhbmdlQXRQb3NpdGlvbih4LCB5KTsKLSAgICB9Ci19
OwotCi0vKioKICAqIEBwYXJhbSB7IURhdGV9IGRhdGUKICAqLwotRGF5c1RhYmxlLnByb3RvdHlw
ZS5zZWxlY3REYXRlID0gZnVuY3Rpb24oZGF0ZSkgeworRGF5c1RhYmxlLnByb3RvdHlwZS5zZWxl
Y3RSYW5nZSA9IGZ1bmN0aW9uKGRheSkgewogICAgIHRoaXMuX2Rlc2VsZWN0KCk7Ci0gICAgdGhp
cy5fbmF2aWdhdGVUb01vbnRoV2l0aEFuaW1hdGlvbihNb250aC5jcmVhdGVGcm9tRGF0ZShkYXRl
KSk7Ci0gICAgdmFyIGRhdGVTdHJpbmcgPSBzZXJpYWxpemVEYXRlKGRhdGUuZ2V0VVRDRnVsbFll
YXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSk7CisgICAgdGhpcy5w
aWNrZXIuc2hvd01vbnRoKE1vbnRoLmNyZWF0ZUZyb21EYXRlKGRheS5zdGFydERhdGUoKSksIHRy
dWUpOworICAgIHZhciBkYXRlU3RyaW5nID0gZGF5LnRvU3RyaW5nKCk7CiAgICAgZm9yICh2YXIg
dyA9IDA7IHcgPCBEYXlzVGFibGUuX1dlZWtzOyB3KyspIHsKICAgICAgICAgZm9yICh2YXIgZCA9
IDA7IGQgPCA3OyBkKyspIHsKICAgICAgICAgICAgIGlmICh0aGlzLl9kYXlzW3ddW2RdLmRhdGFz
ZXQuc3VibWl0VmFsdWUgPT0gZGF0ZVN0cmluZykgewpAQCAtMTExMywxMCArMTE4MiwxMCBAQCBE
YXlzVGFibGUucHJvdG90eXBlLl9kZXNlbGVjdCA9IGZ1bmN0aW9uKCkgewogICogQHJldHVybiB7
IWJvb2xlYW59CiAgKi8KIERheXNUYWJsZS5wcm90b3R5cGUuX21heWJlU2V0UHJldmlvdXNNb250
aCA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXJyZW50TW9udGggPSB0aGlzLnBpY2tlci55ZWFy
TW9udGhDb250cm9sbGVyLm1vbnRoKCk7Ci0gICAgaWYgKHRoaXMucGlja2VyLm1pbmltdW1EYXRl
ID49IGN1cnJlbnRNb250aC5zdGFydERhdGUoKSkKKyAgICB2YXIgcHJldmlvdXNNb250aCA9IHRo
aXMucGlja2VyLmN1cnJlbnRNb250aCgpLnByZXZpb3VzKCk7CisgICAgaWYgKCF0aGlzLnBpY2tl
ci5zaG91bGRTaG93TW9udGgocHJldmlvdXNNb250aCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB0aGlzLl9uYXZpZ2F0ZVRvTW9udGhXaXRoQW5pbWF0aW9uKGN1cnJlbnRNb250aC5wcmV2
aW91cygpKTsKKyAgICB0aGlzLnBpY2tlci5zaG93TW9udGgocHJldmlvdXNNb250aCwgdHJ1ZSk7
CiAgICAgcmV0dXJuIHRydWU7CiB9OwogCkBAIC0xMTI0LDEwICsxMTkzLDEwIEBAIERheXNUYWJs
ZS5wcm90b3R5cGUuX21heWJlU2V0UHJldmlvdXNNb250aCA9IGZ1bmN0aW9uKCkgewogICogQHJl
dHVybiB7IWJvb2xlYW59CiAgKi8KIERheXNUYWJsZS5wcm90b3R5cGUuX21heWJlU2V0TmV4dE1v
bnRoID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGN1cnJlbnRNb250aCA9IHRoaXMucGlja2VyLnll
YXJNb250aENvbnRyb2xsZXIubW9udGgoKTsKLSAgICBpZiAodGhpcy5waWNrZXIubWF4aW11bURh
dGUgPCBjdXJyZW50TW9udGguZW5kRGF0ZSgpKQorICAgIHZhciBuZXh0TW9udGggPSB0aGlzLnBp
Y2tlci5jdXJyZW50TW9udGgoKS5uZXh0KCk7CisgICAgaWYgKCF0aGlzLnBpY2tlci5zaG91bGRT
aG93TW9udGgobmV4dE1vbnRoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHRoaXMuX25h
dmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24oY3VycmVudE1vbnRoLm5leHQoKSk7CisgICAgdGhp
cy5waWNrZXIuc2hvd01vbnRoKG5leHRNb250aCwgdHJ1ZSk7CiAgICAgcmV0dXJuIHRydWU7CiB9
OwogCkBAIC0xMjM3LDcgKzEzMDYsNyBAQCBEYXlzVGFibGUucHJvdG90eXBlLl9oYW5kbGVLZXkg
PSBmdW5jdGlvbihldmVudCkgewogICAgICAgICB9CiAKICAgICB9IGVsc2UgaWYgKGtleSA9PSAi
VSswMDU0IikgeyAvLyAndCcKLSAgICAgICAgdGhpcy5zZWxlY3REYXRlKG5ldyBEYXRlKCkpOwor
ICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKERheS5jcmVhdGVGcm9tVG9kYXkoKSk7CiAgICAgICAg
IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgp
OwogICAgIH0KQEAgLTEyNzEsMTEgKzEzNDAsMTEgQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBl
Ll9oYW5kbGVCb2R5S2V5RG93biA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICB0aGlz
Lmxhc3RGb2N1c2FibGVDb250cm9sLmZvY3VzKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYg
KGtleSA9PSAiVSswMDREIikgeyAvLyAnbScKLSAgICAgICAgdGhpcy55ZWFyTW9udGhDb250cm9s
bGVyLm1vdmVSZWxhdGl2ZWx5KGV2ZW50LnNoaWZ0S2V5ID8gWWVhck1vbnRoQ29udHJvbGxlci5Q
cmV2aW91c01vbnRoIDogWWVhck1vbnRoQ29udHJvbGxlci5OZXh0TW9udGgpOworICAgICAgICB0
aGlzLl95ZWFyTW9udGhDb250cm9sbGVyLm1vdmVSZWxhdGl2ZWx5KGV2ZW50LnNoaWZ0S2V5ID8g
WWVhck1vbnRoQ29udHJvbGxlci5QcmV2aW91c01vbnRoIDogWWVhck1vbnRoQ29udHJvbGxlci5O
ZXh0TW9udGgpOwogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVKzAwNTkiKSB7IC8vICd5JwotICAg
ICAgICB0aGlzLnllYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRL
ZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzWWVhciA6IFllYXJNb250aENvbnRyb2xs
ZXIuTmV4dFllYXIpOworICAgICAgICB0aGlzLl95ZWFyTW9udGhDb250cm9sbGVyLm1vdmVSZWxh
dGl2ZWx5KGV2ZW50LnNoaWZ0S2V5ID8gWWVhck1vbnRoQ29udHJvbGxlci5QcmV2aW91c1llYXIg
OiBZZWFyTW9udGhDb250cm9sbGVyLk5leHRZZWFyKTsKICAgICB9IGVsc2UgaWYgKGtleSA9PSAi
VSswMDQ0IikgeyAvLyAnZCcKLSAgICAgICAgdGhpcy55ZWFyTW9udGhDb250cm9sbGVyLm1vdmVS
ZWxhdGl2ZWx5KGV2ZW50LnNoaWZ0S2V5ID8gWWVhck1vbnRoQ29udHJvbGxlci5QcmV2aW91c1Rl
blllYXJzIDogWWVhck1vbnRoQ29udHJvbGxlci5OZXh0VGVuWWVhcnMpOworICAgICAgICB0aGlz
Ll95ZWFyTW9udGhDb250cm9sbGVyLm1vdmVSZWxhdGl2ZWx5KGV2ZW50LnNoaWZ0S2V5ID8gWWVh
ck1vbnRoQ29udHJvbGxlci5QcmV2aW91c1RlblllYXJzIDogWWVhck1vbnRoQ29udHJvbGxlci5O
ZXh0VGVuWWVhcnMpOwogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVKzAwMUIiKSAvLyBFU0MKICAg
ICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172482</attachid>
            <date>2012-11-05 21:17:27 -0800</date>
            <delta_ts>2012-11-05 23:18:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101194-20121106141540.patch</filename>
            <type>text/plain</type>
            <size>27446</size>
            <attacher name="Keishi Hattori">keishi</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzNTU0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWM1MDhmYzk2NzQxOTI5
YTg4ODRiYTY3MzkzZTVmZDIxMjI1NjZjMS4uMjk0MmM3M2ExY2NhMmJlNjlkY2NkZTVhMGJhZTdi
N2U3M2Q1YWYzNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDEyLTExLTA1ICBLZWlz
aGkgSGF0dG9yaSAgPGtlaXNoaUB3ZWJraXQub3JnPgorCisgICAgICAgIEludHJvZHVjZSBEYXkg
Y2xhc3MgdG8gY2FsZW5kYXIgcGlja2VyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMDExOTQKKworICAgICAgICBSZXZpZXdlZCBieSBLZW50IFRhbXVy
YS4KKworICAgICAgICBJbnRyb2R1Y2luZyBEYXkgY2xhc3Mgc28gZGF5LCB3ZWVrLCBhbmQgbW9u
dGggY2FuIGFsbCBiZSBhYnN0cmFjdGVkLiBUbworICAgICAgICBzb2x2ZSBzb21lIG9mIHRoZSBj
b21wbGV4aXR5IGFyb3VuZCB3aGljaCBtb250aHMgdG8gc2hvdywgSSBtYWRlCisgICAgICAgIENh
bGVuZGFyUGlja2VyIGluIGNoYXJnZSBvZiBpdC4gVGhpcyBhbHNvIG1hZGUgWWVhck1vbnRoQ29u
dHJvbGxlciBhbmQKKyAgICAgICAgRGF5c1RhYmxlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIu
CisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiBDb3ZlcmVkIGJ5IGV4aXN0aW5nIGNhbGVuZGFyLXBp
Y2tlci0qLmh0bWwgdGVzdHMuCisKKyAgICAgICAgKiBSZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxl
bmRhclBpY2tlci5qczoKKyAgICAgICAgKGNyZWF0ZVVUQ0RhdGUpOiBBbGxvdyBuZWdhdGl2ZSBt
b250aCBvciBkYXRlLgorICAgICAgICAocGFyc2VEYXRlU3RyaW5nKTogV2lsbCByZXR1cm4gRGF5
IG9yIE1vbnRoIGRlcGVuZGluZyBvbiBzdHJpbmcgZm9ybWF0LgorICAgICAgICAoRGF5KTogUmVw
cmVzZW50cyBhIGRheS4KKyAgICAgICAgKERheS5wYXJzZSk6IFBhcnNlIHl5eXktbW0tZGQuCisg
ICAgICAgIChEYXkuY3JlYXRlRnJvbURhdGUpOiBDcmVhdGVzIGEgRGF5IHRoYXQgY29udGFpbnMg
YSBkYXRldGltZS4KKyAgICAgICAgKERheS5jcmVhdGVGcm9tVG9kYXkpOiBDcmVhdGVzIERheSBm
b3IgdG9kYXkuIEEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIFdl
ZWsgYW5kIE1vbnRoIGluIHRoZSBmdXR1cmUuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVxdWFs
cyk6IFJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KKyAgICAgICAgKERheS5wcm90
b3R5cGUucHJldmlvdXMpOiBSZXR1cm5zIHRoZSBwcmV2aW91cyBkYXkuCisgICAgICAgIChEYXku
cHJvdG90eXBlLm5leHQpOiBSZXR1cm5zIHRoZSBuZXh0IGRheS4KKyAgICAgICAgKERheS5wcm90
b3R5cGUuc3RhcnREYXRlKTogUmV0dXJucyB0aGUgZGF0ZXRpbWUgdGhhdCBpcyB0aGUgc3RhcnQg
b2YgdGhpcyBkYXkuCisgICAgICAgIChEYXkucHJvdG90eXBlLmVuZERhdGUpOiBSZXR1cm5zIHRo
ZSBkYXRldGltZSB0aGF0IGlzIHRoZSBzdGFydCBvZiB0aGlzIGRheS4KKyAgICAgICAgKERheS5w
cm90b3R5cGUudmFsdWVPZik6IFJldHVybnMgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaC4K
KyAgICAgICAgKERheS5wcm90b3R5cGUudG9TdHJpbmcpOiBSZXR1cm5zIGFuIElTTyBkYXRlIHN0
cmluZy4KKyAgICAgICAgKE1vbnRoKTogRml4IGJ1ZyBpbiBjYWxjdWxhdGluZyBtb250aCBmcm9t
IHZhbHVlLgorICAgICAgICAoTW9udGgucHJvdG90eXBlLmVuZERhdGUpOiBVc2UgRGF5Lk1heGlt
dW0uCisgICAgICAgIChDYWxlbmRhclBpY2tlcik6IEFkZGVkIF9jdXJyZW50TW9udGguIHllYXJN
b250aENvbnRyb2xsZXIgYW5kIGRheXNUYWJsZSBjYW4gYmUgcHJpdmF0ZSBtZW1iZXJzIG5vdy4K
KyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0KToKKyAgICAgICAgKENh
bGVuZGFyUGlja2VyLnByb3RvdHlwZS5oYW5kbGVUb2RheSk6IFVzZSBEYXkuY3JlYXRlRnJvbVRv
ZGF5LgorICAgICAgICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3VsZFNob3dNb250aCk6
IFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9udGggc2hvdWxkIGJlIHNob3duLgorICAgICAgICAoQ2Fs
ZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3dNb250aCk6IFNob3dzIHRoZSBnaXZlbiBtb250aC4g
SWYgdGhlIG1vbnRoIGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgbW9udGhzIHRoYXQgc2hvdWxkIGJl
IHNob3duLCB3ZSBjbGFtcCB0aGUgbW9udGggYW5kIHNob3cgdGhhdC4KKyAgICAgICAgKENhbGVu
ZGFyUGlja2VyLnByb3RvdHlwZS5jdXJyZW50TW9udGgpOiBSZXR1cm5zIHRoZSBjdXJyZW50IG1v
bnRoIHRoYXQgaXMgc2hvd24uCisgICAgICAgIChZZWFyTW9udGhDb250cm9sbGVyKTogUmVtb3Zl
ZCBfY3VycmVudE1vbnRoLgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUu
YXR0YWNoVG8pOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuc2V0TW9u
dGgpOgorICAgICAgICAoWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX2hhbmRsZVllYXJN
b250aENoYW5nZSk6IFVzZSBDYWxlbmRhclBpY2tlci5zaG93TW9udGgKKyAgICAgICAgKFllYXJN
b250aENvbnRyb2xsZXIucHJvdG90eXBlLm1vdmVSZWxhdGl2ZWx5KToKKyAgICAgICAgKERheXNU
YWJsZSk6CisgICAgICAgIChDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX3N0ZXBNaXNtYXRjaCk6
IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fb3V0T2ZS
YW5nZSk6IE1hZGUgcHJpdmF0ZS4KKyAgICAgICAgKENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5p
c1ZhbGlkRGF0ZSk6IFRha2UgRGF5IG9yIE1vbnRoIGluc3RlYWQgb2YgbWlsbGlzZWNvbmRzIHNp
bmNlIGVwb2NoLgorICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGgpOgor
ICAgICAgICAoRGF5c1RhYmxlLnByb3RvdHlwZS5uYXZpZ2F0ZVRvTW9udGgpOiBTaG93cyBhIGdp
dmVuIG1vbnRoLiBDYW4gdXNlIGFuaW1hdGlvbiBhbmQgbGVhdmUgdGhlIHNlbGVjdGlvbiBwb3Np
dGlvbiBhcyBpcy4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuc2VsZWN0UmFuZ2UpOiBT
ZWxlY3QgYSByYW5nZS4KKyAgICAgICAgKERheXNUYWJsZS5wcm90b3R5cGUuX21heWJlU2V0UHJl
dmlvdXNNb250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9tYXliZVNldE5leHRN
b250aCk6CisgICAgICAgIChEYXlzVGFibGUucHJvdG90eXBlLl9oYW5kbGVLZXkpOgorICAgICAg
ICAoQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9oYW5kbGVCb2R5S2V5RG93bik6CisKIDIwMTIt
MTEtMDUgIEtlbmljaGkgSXNoaWJhc2hpICA8YmFzaGlAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFtDaHJvbWl1bV0gVW5pY29kZSBjb21iaW5pbmcgZGlhY3JpdGljYWwgYXJlbid0IGFsd2F5cyBj
b21iaW5lZCBvbiBMaW51eApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvUmVzb3VyY2VzL3Bh
Z2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuanMgYi9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFn
ZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcwppbmRleCA2NTYxNDZkMDA3MGVlN2YwOTliN2U0ZTdl
NjI2OTg0ZDgwMDVkY2VmLi4zMDg0Y2Q0MjNmOGM3Nzc0YmZkZDVkYzcyMWMzN2RiYjJjZDI4YTZj
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRh
clBpY2tlci5qcworKysgYi9Tb3VyY2UvV2ViQ29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxl
bmRhclBpY2tlci5qcwpAQCAtMTc1LDM5ICsxNzUsMTI2IEBAIE1vbnRoLnByb3RvdHlwZS50b0xv
Y2FsZVN0cmluZyA9IGZ1bmN0aW9uKCkgewogfTsKIAogZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSh5
ZWFyLCBtb250aCwgZGF0ZSkgewotICAgIHZhciBuZXdEYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMo
eWVhciwgbW9udGgsIGRhdGUpKTsKLSAgICBpZiAoeWVhciA8IDEwMCkKLSAgICAgICAgbmV3RGF0
ZS5zZXRVVENGdWxsWWVhcih5ZWFyKTsKKyAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKDApOwor
ICAgIG5ld0RhdGUuc2V0VVRDRnVsbFllYXIoeWVhcik7CisgICAgbmV3RGF0ZS5zZXRVVENNb250
aChtb250aCk7CisgICAgbmV3RGF0ZS5zZXRVVENEYXRlKGRhdGUpOwogICAgIHJldHVybiBuZXdE
YXRlOwogfTsKIAogLyoqCi0gKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jdXJyZW50Ci0gKiBAcmV0
dXJuIHshRGF0ZX0KKyAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlU3RyaW5nCisgKiBAcmV0dXJuIHs/
RGF5fE1vbnRofQorICovCitmdW5jdGlvbiBwYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZykgewor
ICAgIHZhciBtb250aCA9IE1vbnRoLnBhcnNlKGRhdGVTdHJpbmcpOworICAgIGlmIChtb250aCkK
KyAgICAgICAgcmV0dXJuIG1vbnRoOworICAgIHJldHVybiBEYXkucGFyc2UoZGF0ZVN0cmluZyk7
Cit9CisKKy8qKgorICogQHBhcmFtIHshbnVtYmVyfERheX0gdmFsdWVPckRheU9yWWVhcgorICog
QHBhcmFtIHshbnVtYmVyPX0gbW9udGgKKyAqIEBwYXJhbSB7IW51bWJlcj19IGRhdGUKKyAqLwor
ZnVuY3Rpb24gRGF5KHZhbHVlT3JEYXlPclllYXIsIG1vbnRoLCBkYXRlKSB7CisgICAgdmFyIGRh
dGVPYmplY3Q7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykKKyAgICAgICAgZGF0ZU9i
amVjdCA9IGNyZWF0ZVVUQ0RhdGUodmFsdWVPckRheU9yWWVhciwgbW9udGgsIGRhdGUpOworICAg
IGVsc2UgaWYgKHZhbHVlT3JEYXlPclllYXIgaW5zdGFuY2VvZiBEYXkpCisgICAgICAgIGRhdGVP
YmplY3QgPSBjcmVhdGVVVENEYXRlKHZhbHVlT3JEYXlPclllYXIueWVhciwgdmFsdWVPckRheU9y
WWVhci5tb250aCwgdmFsdWVPckRheU9yWWVhci5kYXRlKTsKKyAgICBlbHNlCisgICAgICAgIGRh
dGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZU9yRGF5T3JZZWFyKTsKKyAgICB0aGlzLnllYXIgPSBk
YXRlT2JqZWN0LmdldFVUQ0Z1bGxZZWFyKCk7ICAgIAorICAgIHRoaXMubW9udGggPSBkYXRlT2Jq
ZWN0LmdldFVUQ01vbnRoKCk7CisgICAgdGhpcy5kYXRlID0gZGF0ZU9iamVjdC5nZXRVVENEYXRl
KCk7Cit9OworCitEYXkuSVNPU3RyaW5nUmVnRXhwID0gL14oXGQrKS0oXGQrKS0oXGQrKSQvOwor
CisvLyBTZWUgV2ViQ29yZS9wbGF0Zm9ybS9EYXRlQ29tcG9uZW50cy5oLgorRGF5Lk1pbmltdW0g
PSBuZXcgRGF0ZSgtNjIxMzU1OTY4MDAwMDAuMCk7CitEYXkuTWF4aW11bSA9IG5ldyBEYXRlKDg2
NDAwMDAwMDAwMDAwMDAuMCk7CisKKy8qKgorICogQHBhcmFtIHshc3RyaW5nfSBzdHIKKyAqIEBy
ZXR1cm4gez9Nb250aH0KICAqLwotZnVuY3Rpb24gcGFyc2VEYXRlU3RyaW5nKG9wdF9jdXJyZW50
KSB7Ci0gICAgaWYgKG9wdF9jdXJyZW50KSB7Ci0gICAgICAgIHZhciByZXN1bHQgPSBvcHRfY3Vy
cmVudC5tYXRjaCgvKFxkKyktKFxkKyktKFxkKykvKTsKLSAgICAgICAgaWYgKHJlc3VsdCkKLSAg
ICAgICAgICAgIHJldHVybiBjcmVhdGVVVENEYXRlKE51bWJlcihyZXN1bHRbMV0pLCBOdW1iZXIo
cmVzdWx0WzJdKSAtIDEsIE51bWJlcihyZXN1bHRbM10pKTsKLSAgICB9CitEYXkucGFyc2UgPSBm
dW5jdGlvbihzdHIpIHsKKyAgICB2YXIgbWF0Y2ggPSBEYXkuSVNPU3RyaW5nUmVnRXhwLmV4ZWMo
c3RyKTsKKyAgICBpZiAoIW1hdGNoKQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB2YXIgeWVh
ciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CisgICAgdmFyIG1vbnRoID0gcGFyc2VJbnQobWF0
Y2hbMl0sIDEwKSAtIDE7CisgICAgdmFyIGRhdGUgPSBwYXJzZUludChtYXRjaFszXSwgMTApOwor
ICAgIHJldHVybiBuZXcgRGF5KHllYXIsIG1vbnRoLCBkYXRlKTsKK307CisvKioKKyAqIEBwYXJh
bSB7IURhdGV9IGRhdGUKKyAqIEByZXR1cm4geyFNb250aH0KKyAqLworRGF5LmNyZWF0ZUZyb21E
YXRlID0gZnVuY3Rpb24oZGF0ZSkgeworICAgIHJldHVybiBuZXcgRGF5KGRhdGUuZ2V0VVRDRnVs
bFllYXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSk7Cit9OworCitE
YXkuY3JlYXRlRnJvbVRvZGF5ID0gZnVuY3Rpb24oKSB7CiAgICAgdmFyIG5vdyA9IG5ldyBEYXRl
KCk7Ci0gICAgLy8gQ3JlYXRlIFVUQyBkYXRlIHdpdGggc2FtZSBudW1iZXJzIGFzIGxvY2FsIGRh
dGUuCi0gICAgcmV0dXJuIGNyZWF0ZVVUQ0RhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRN
b250aCgpLCBub3cuZ2V0RGF0ZSgpKTsKKyAgICByZXR1cm4gbmV3IERheShub3cuZ2V0RnVsbFll
YXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCkpOwogfQogCiAvKioKLSAqIEBwYXJh
bSB7IW51bWJlcn0geWVhcgotICogQHBhcmFtIHshbnVtYmVyfSBtb250aAotICogQHBhcmFtIHsh
bnVtYmVyfSBkYXkKKyAqIEBwYXJhbSB7IURheX0gb3RoZXIKKyAqIEByZXR1cm4geyFib29sfQor
ICovCitEYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7CisgICAgcmV0dXJu
IHRoaXMueWVhciA9PT0gb3RoZXIueWVhciAmJiB0aGlzLm1vbnRoID09PSBvdGhlci5tb250aCAm
JiB0aGlzLmRhdGUgPT09IG90aGVyLmRhdGU7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFEYXl9
CisgKi8KK0RheS5wcm90b3R5cGUucHJldmlvdXMgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
bmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSAtIDEpOworfTsKKworLyoq
CisgKiBAcmV0dXJuIHshRGF5fQorICovCitEYXkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gbmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSAr
IDEpOworfTsKKworLyoqCisgKiBAcmV0dXJuIHshRGF0ZX0KKyAqLworRGF5LnByb3RvdHlwZS5z
dGFydERhdGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gY3JlYXRlVVRDRGF0ZSh0aGlzLnll
YXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSk7Cit9OworCisvKioKKyAqIEByZXR1cm4geyFEYXRl
fQorICovCitEYXkucHJvdG90eXBlLmVuZERhdGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
Y3JlYXRlVVRDRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSArIDEpOworfTsK
KworLyoqCisgKiBAcmV0dXJuIHshbnVtYmVyfQorICovCitEYXkucHJvdG90eXBlLnZhbHVlT2Yg
PSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zdGFydERhdGUoKS5nZXRUaW1lKCk7Cit9
OworCisvKioKICAqIEByZXR1cm4geyFzdHJpbmd9CiAgKi8KLWZ1bmN0aW9uIHNlcmlhbGl6ZURh
dGUoeWVhciwgbW9udGgsIGRheSkgewotICAgIHZhciB5ZWFyU3RyaW5nID0gU3RyaW5nKHllYXIp
OworRGF5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeworICAgIHZhciB5ZWFyU3Ry
aW5nID0gU3RyaW5nKHRoaXMueWVhcik7CiAgICAgaWYgKHllYXJTdHJpbmcubGVuZ3RoIDwgNCkK
ICAgICAgICAgeWVhclN0cmluZyA9ICgiMDAwIiArIHllYXJTdHJpbmcpLnN1YnN0cigtNCwgNCk7
Ci0gICAgcmV0dXJuIHllYXJTdHJpbmcgKyAiLSIgKyAoIjAiICsgKG1vbnRoICsgMSkpLnN1YnN0
cigtMiwgMikgKyAiLSIgKyAoIjAiICsgZGF5KS5zdWJzdHIoLTIsIDIpOwotfQorICAgIHJldHVy
biB5ZWFyU3RyaW5nICsgIi0iICsgKCIwIiArICh0aGlzLm1vbnRoICsgMSkpLnN1YnN0cigtMiwg
MikgKyAiLSIgKyAoIjAiICsgdGhpcy5kYXRlKS5zdWJzdHIoLTIsIDIpOworfTsKIAogLyoqCiAg
KiBAcGFyYW0geyFudW1iZXJ8TW9udGh9IHZhbHVlT3JNb250aE9yWWVhcgpAQCAtMjIxLDEyICsz
MDgsMTIgQEAgZnVuY3Rpb24gTW9udGgodmFsdWVPck1vbnRoT3JZZWFyLCBtb250aCkgewogICAg
ICAgICB0aGlzLnllYXIgPSB2YWx1ZU9yTW9udGhPclllYXIueWVhcjsKICAgICAgICAgdGhpcy5t
b250aCA9IHZhbHVlT3JNb250aE9yWWVhci5tb250aDsKICAgICB9IGVsc2UgewotICAgICAgICB0
aGlzLnllYXIgPSBNYXRoLmZsb29yKHZhbHVlT3JNb250aE9yWWVhciAvIDEyKSArIDE5NzA7Ci0g
ICAgICAgIHRoaXMubW9udGggPSB2YWx1ZU9yTW9udGhPclllYXIgJSAxMjsKKyAgICAgICAgdGhp
cy55ZWFyID0gMTk3MDsKKyAgICAgICAgdGhpcy5tb250aCA9IHZhbHVlT3JNb250aE9yWWVhcjsK
ICAgICB9CiAgICAgdGhpcy55ZWFyID0gdGhpcy55ZWFyICsgTWF0aC5mbG9vcih0aGlzLm1vbnRo
IC8gMTIpOwogICAgIHRoaXMubW9udGggPSB0aGlzLm1vbnRoIDwgMCA/IHRoaXMubW9udGggJSAx
MiArIDEyIDogdGhpcy5tb250aCAlIDEyOwotICAgIGlmICh0aGlzLnllYXIgPCAwIHx8IE1vbnRo
Lk1heGltdW0gPCB0aGlzKSB7CisgICAgaWYgKHRoaXMueWVhciA8PSAwIHx8IE1vbnRoLk1heGlt
dW0gPCB0aGlzKSB7CiAgICAgICAgIHRoaXMueWVhciA9IE5hTjsKICAgICAgICAgdGhpcy5tb250
aCA9IE5hTjsKICAgICB9CkBAIC0yOTIsNyArMzc5LDcgQEAgTW9udGgucHJvdG90eXBlLnN0YXJ0
RGF0ZSA9IGZ1bmN0aW9uKCkgewogICovCiBNb250aC5wcm90b3R5cGUuZW5kRGF0ZSA9IGZ1bmN0
aW9uKCkgewogICAgIGlmICh0aGlzLmVxdWFscyhNb250aC5NYXhpbXVtKSkKLSAgICAgICAgcmV0
dXJuIENhbGVuZGFyUGlja2VyLk1heGltdW1Qb3NzaWJsZURhdGU7CisgICAgICAgIHJldHVybiBE
YXkuTWF4aW11bS5zdGFydERhdGUoKTsKICAgICByZXR1cm4gdGhpcy5uZXh0KCkuc3RhcnREYXRl
KCk7CiB9OwogCkBAIC00MTgsMzAgKzUwNSwzMyBAQCBmdW5jdGlvbiBDYWxlbmRhclBpY2tlcihl
bGVtZW50LCBjb25maWcpIHsKICAgICB0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemVCb3VuZCA9IHRo
aXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZS5iaW5kKHRoaXMpOwogICAgIHdpbmRvdy5hZGRFdmVudExp
c3RlbmVyKCJyZXNpemUiLCB0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemVCb3VuZCwgZmFsc2UpOwog
ICAgIC8vIFdlIGFzc3VtZSB0aGlzLl9jb25maWcubWluIGlzIGEgdmFsaWQgZGF0ZS4KLSAgICB0
aGlzLm1pbmltdW1EYXRlID0gKHR5cGVvZiB0aGlzLl9jb25maWcubWluICE9PSAidW5kZWZpbmVk
IikgPyBwYXJzZURhdGVTdHJpbmcodGhpcy5fY29uZmlnLm1pbikgOiBDYWxlbmRhclBpY2tlci5N
aW5pbXVtUG9zc2libGVEYXRlOworICAgIHRoaXMuX21pbmltdW1WYWx1ZSA9ICh0eXBlb2YgdGhp
cy5fY29uZmlnLm1pbiAhPT0gInVuZGVmaW5lZCIpID8gcGFyc2VEYXRlU3RyaW5nKHRoaXMuX2Nv
bmZpZy5taW4pLnZhbHVlT2YoKSA6IERheS5NaW5pbXVtLnZhbHVlT2YoKTsKICAgICAvLyBXZSBh
c3N1bWUgdGhpcy5fY29uZmlnLm1heCBpcyBhIHZhbGlkIGRhdGUuCi0gICAgdGhpcy5tYXhpbXVt
RGF0ZSA9ICh0eXBlb2YgdGhpcy5fY29uZmlnLm1heCAhPT0gInVuZGVmaW5lZCIpID8gcGFyc2VE
YXRlU3RyaW5nKHRoaXMuX2NvbmZpZy5tYXgpIDogQ2FsZW5kYXJQaWNrZXIuTWF4aW11bVBvc3Np
YmxlRGF0ZTsKKyAgICB0aGlzLl9tYXhpbXVtVmFsdWUgPSAodHlwZW9mIHRoaXMuX2NvbmZpZy5t
YXggIT09ICJ1bmRlZmluZWQiKSA/IHBhcnNlRGF0ZVN0cmluZyh0aGlzLl9jb25maWcubWF4KS52
YWx1ZU9mKCkgOiBEYXkuTWF4aW11bS52YWx1ZU9mKCk7CiAgICAgdGhpcy5zdGVwID0gKHR5cGVv
ZiB0aGlzLl9jb25maWcuc3RlcCAhPT0gdW5kZWZpbmVkKSA/IE51bWJlcih0aGlzLl9jb25maWcu
c3RlcCkgOiBDYWxlbmRhclBpY2tlci5EZWZhdWx0U3RlcFNjYWxlRmFjdG9yOwogICAgIHRoaXMu
c3RlcEJhc2UgPSAodHlwZW9mIHRoaXMuX2NvbmZpZy5zdGVwQmFzZSAhPT0gInVuZGVmaW5lZCIp
ID8gTnVtYmVyKHRoaXMuX2NvbmZpZy5zdGVwQmFzZSkgOiBDYWxlbmRhclBpY2tlci5EZWZhdWx0
U3RlcEJhc2U7Ci0gICAgdGhpcy55ZWFyTW9udGhDb250cm9sbGVyID0gbmV3IFllYXJNb250aENv
bnRyb2xsZXIodGhpcyk7Ci0gICAgdGhpcy5kYXlzVGFibGUgPSBuZXcgRGF5c1RhYmxlKHRoaXMp
OworICAgIHRoaXMuX21pbmltdW1Nb250aCA9IE1vbnRoLmNyZWF0ZUZyb21EYXRlKG5ldyBEYXRl
KHRoaXMuX21pbmltdW1WYWx1ZSkpOworICAgIHRoaXMubWF4aW11bU1vbnRoID0gTW9udGguY3Jl
YXRlRnJvbURhdGUobmV3IERhdGUodGhpcy5fbWF4aW11bVZhbHVlKSk7CisgICAgdGhpcy5fY3Vy
cmVudE1vbnRoID0gbmV3IE1vbnRoKE5hTiwgTmFOKTsKKyAgICB0aGlzLl95ZWFyTW9udGhDb250
cm9sbGVyID0gbmV3IFllYXJNb250aENvbnRyb2xsZXIodGhpcyk7CisgICAgdGhpcy5fZGF5c1Rh
YmxlID0gbmV3IERheXNUYWJsZSh0aGlzKTsKICAgICB0aGlzLl9oYWRLZXlFdmVudCA9IGZhbHNl
OwogICAgIHRoaXMuX2xheW91dCgpOwotICAgIHZhciBpbml0aWFsRGF0ZSA9IHBhcnNlRGF0ZVN0
cmluZyh0aGlzLl9jb25maWcuY3VycmVudFZhbHVlKTsKLSAgICBpZiAoaW5pdGlhbERhdGUgPCB0
aGlzLm1pbmltdW1EYXRlKQotICAgICAgICBpbml0aWFsRGF0ZSA9IHRoaXMubWluaW11bURhdGU7
Ci0gICAgZWxzZSBpZiAoaW5pdGlhbERhdGUgPiB0aGlzLm1heGltdW1EYXRlKQotICAgICAgICBp
bml0aWFsRGF0ZSA9IHRoaXMubWF4aW11bURhdGU7Ci0gICAgdGhpcy5kYXlzVGFibGUuc2VsZWN0
RGF0ZShpbml0aWFsRGF0ZSk7CisgICAgdmFyIGluaXRpYWxTZWxlY3Rpb24gPSBwYXJzZURhdGVT
dHJpbmcodGhpcy5fY29uZmlnLmN1cnJlbnRWYWx1ZSk7CisgICAgaWYgKCFpbml0aWFsU2VsZWN0
aW9uKQorICAgICAgICBpbml0aWFsU2VsZWN0aW9uID0gRGF5LmNyZWF0ZUZyb21Ub2RheSgpOwor
ICAgIGlmIChpbml0aWFsU2VsZWN0aW9uLnZhbHVlT2YoKSA8IHRoaXMuX21pbmltdW1WYWx1ZSkK
KyAgICAgICAgaW5pdGlhbFNlbGVjdGlvbiA9IG5ldyBEYXkodGhpcy5fbWluaW11bVZhbHVlKTsK
KyAgICBlbHNlIGlmIChpbml0aWFsU2VsZWN0aW9uLnZhbHVlT2YoKSA+IHRoaXMuX21heGltdW1W
YWx1ZSkKKyAgICAgICAgaW5pdGlhbFNlbGVjdGlvbiA9IG5ldyBEYXkodGhpcy5fbWF4aW11bVZh
bHVlKTsKKyAgICB0aGlzLnNob3dNb250aChNb250aC5jcmVhdGVGcm9tRGF0ZShpbml0aWFsU2Vs
ZWN0aW9uLnN0YXJ0RGF0ZSgpKSwgZmFsc2UpOworICAgIHRoaXMuX2RheXNUYWJsZS5zZWxlY3RS
YW5nZShpbml0aWFsU2VsZWN0aW9uKTsKICAgICB0aGlzLmZpeFdpbmRvd1NpemUoKTsKICAgICB0
aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJvdW5kID0gdGhpcy5faGFuZGxlQm9keUtleURvd24uYmlu
ZCh0aGlzKTsKICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0
aGlzLl9oYW5kbGVCb2R5S2V5RG93bkJvdW5kLCBmYWxzZSk7CiB9CiBDYWxlbmRhclBpY2tlci5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFBpY2tlci5wcm90b3R5cGUpOwogCi0vLyBIYXJkIGxp
bWl0cyBvZiB0eXBlPWRhdGUuIFNlZSBXZWJDb3JlL3BsYXRmb3JtL0RhdGVDb21wb25lbnRzLmgu
Ci1DYWxlbmRhclBpY2tlci5NaW5pbXVtUG9zc2libGVEYXRlID0gbmV3IERhdGUoLTYyMTM1NTk2
ODAwMDAwLjApOwotQ2FsZW5kYXJQaWNrZXIuTWF4aW11bVBvc3NpYmxlRGF0ZSA9IG5ldyBEYXRl
KDg2NDAwMDAwMDAwMDAwMDAuMCk7CiAvLyBTZWUgV2ViQ29yZS9odG1sL0RhdGVJbnB1dFR5cGUu
Y3BwLgogQ2FsZW5kYXJQaWNrZXIuRGVmYXVsdFN0ZXBTY2FsZUZhY3RvciA9IDg2NDAwMDAwOwog
Q2FsZW5kYXJQaWNrZXIuRGVmYXVsdFN0ZXBCYXNlID0gMC4wOwpAQCAtNDU3LDE3ICs1NDcsMTcg
QEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbigpIHsKIENhbGVu
ZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0ID0gZnVuY3Rpb24oKSB7CiAgICAgaWYgKHRoaXMu
X2NvbmZpZy5pc0NhbGVuZGFyUlRMKQogICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5h
ZGQoInJ0bCIpOwotICAgIHRoaXMueWVhck1vbnRoQ29udHJvbGxlci5hdHRhY2hUbyh0aGlzLl9l
bGVtZW50KTsKLSAgICB0aGlzLmRheXNUYWJsZS5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsKKyAg
ICB0aGlzLl95ZWFyTW9udGhDb250cm9sbGVyLmF0dGFjaFRvKHRoaXMuX2VsZW1lbnQpOworICAg
IHRoaXMuX2RheXNUYWJsZS5hdHRhY2hUbyh0aGlzLl9lbGVtZW50KTsKICAgICB0aGlzLl9sYXlv
dXRCdXR0b25zKCk7CiAgICAgLy8gRGF5c1RhYmxlIHdpbGwgaGF2ZSBmb2N1cyBidXQgd2UgZG9u
J3Qgd2FudCB0byBzaG93IGl0cyBmb2N1cyByaW5nIHVudGlsIHRoZSBmaXJzdCBrZXkgZXZlbnQu
CiAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZXMuTm9Gb2N1c1Jpbmcp
OwogfTsKIAogQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLmhhbmRsZVRvZGF5ID0gZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgIHRoaXMuZGF5c1RhYmxlLnNlbGVj
dERhdGUoZGF0ZSk7Ci0gICAgdGhpcy5zdWJtaXRWYWx1ZShzZXJpYWxpemVEYXRlKGRhdGUuZ2V0
RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkpOworICAgIHZhciB0
b2RheSA9IERheS5jcmVhdGVGcm9tVG9kYXkoKTsKKyAgICB0aGlzLl9kYXlzVGFibGUuc2VsZWN0
UmFuZ2UodG9kYXkpOworICAgIHRoaXMuc3VibWl0VmFsdWUodG9kYXkudG9TdHJpbmcoKSk7CiB9
OwogCiBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuaGFuZGxlQ2xlYXIgPSBmdW5jdGlvbigpIHsK
QEAgLTUyOCw2ICs2MTgsMzggQEAgQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9sYXlvdXRCdXR0
b25zID0gZnVuY3Rpb24oKSB7CiAgICAgdGhpcy5sYXN0Rm9jdXNhYmxlQ29udHJvbCA9IHRoaXMu
Y2xlYXIgfHwgdGhpcy50b2RheTsKIH07CiAKKy8qKgorICogQHBhcmFtIHshTW9udGh9IG1vbnRo
CisgKiBAcmV0dXJuIHshYm9vbH0KKyAqLworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3Vs
ZFNob3dNb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7CisgICAgcmV0dXJuIHRoaXMuX21pbmltdW1N
b250aC52YWx1ZU9mKCkgPD0gbW9udGgudmFsdWVPZigpICYmIHRoaXMubWF4aW11bU1vbnRoLnZh
bHVlT2YoKSA+PSBtb250aC52YWx1ZU9mKCk7Cit9OworCisvKioKKyAqIEBwYXJhbSB7IU1vbnRo
fSBtb250aAorICogQHBhcmFtIHshYm9vbD19IGFuaW1hdGUKKyAqIEBwYXJhbSB7IWJvb2w9fSBr
ZWVwU2VsZWN0aW9uUG9zaXRpb24KKyAqLworQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLnNob3dN
b250aCA9IGZ1bmN0aW9uKG1vbnRoLCBhbmltYXRlLCBrZWVwU2VsZWN0aW9uUG9zaXRpb24pIHsK
KyAgICBpZiAodGhpcy5fY3VycmVudE1vbnRoLmVxdWFscyhtb250aCkpCisgICAgICAgIHJldHVy
bjsKKyAgICBlbHNlIGlmIChtb250aC52YWx1ZU9mKCkgPCB0aGlzLl9taW5pbXVtTW9udGgudmFs
dWVPZigpKQorICAgICAgICBtb250aCA9IHRoaXMuX21pbmltdW1Nb250aDsKKyAgICBlbHNlIGlm
IChtb250aC52YWx1ZU9mKCkgPiB0aGlzLm1heGltdW1Nb250aC52YWx1ZU9mKCkpCisgICAgICAg
IG1vbnRoID0gdGhpcy5tYXhpbXVtTW9udGg7CisgICAgdGhpcy5feWVhck1vbnRoQ29udHJvbGxl
ci5zZXRNb250aChtb250aCk7CisgICAgdGhpcy5fZGF5c1RhYmxlLm5hdmlnYXRlVG9Nb250aCht
b250aCwgYW5pbWF0ZSwga2VlcFNlbGVjdGlvblBvc2l0aW9uKTsKKyAgICB0aGlzLl9jdXJyZW50
TW9udGggPSBtb250aDsKK307CisKKy8qKgorICogQHJldHVybiB7IU1vbnRofQorICovCitDYWxl
bmRhclBpY2tlci5wcm90b3R5cGUuY3VycmVudE1vbnRoID0gZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuIHRoaXMuX2N1cnJlbnRNb250aDsKK307CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLyoqCkBAIC01MzYs
MTAgKzY1OCw2IEBAIENhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fbGF5b3V0QnV0dG9ucyA9IGZ1
bmN0aW9uKCkgewogICovCiBmdW5jdGlvbiBZZWFyTW9udGhDb250cm9sbGVyKHBpY2tlcikgewog
ICAgIHRoaXMucGlja2VyID0gcGlja2VyOwotICAgIC8qKgotICAgICAqIEB0eXBlIHs/TW9udGh9
Ci0gICAgICovCi0gICAgdGhpcy5fY3VycmVudE1vbnRoID0gbnVsbDsKIH0KIAogLyoqCkBAIC01
NzYsMTQgKzY5NCwxMiBAQCBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5hdHRhY2hUbyA9
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICB0aGlzLl93YWxsLmFkZEV2ZW50TGlzdGVuZXIoImNs
aWNrIiwgdGhpcy5fY2xvc2VQb3B1cC5iaW5kKHRoaXMpLCBmYWxzZSk7CiAgICAgZWxlbWVudC5h
cHBlbmRDaGlsZCh0aGlzLl93YWxsKTsKIAotICAgIHZhciBtYXhpbXVtWWVhciA9IHRoaXMucGlj
a2VyLm1heGltdW1EYXRlLmdldFVUQ0Z1bGxZZWFyKCk7Ci0gICAgLy8gQmVjYXVzZSB0aGUgbWF4
aW11bSBwb3NzaWJsZSB5ZWFyIGlzIFNlcHRlbWJlciB3ZSBzaG91bGQgdXNlIHRoZSB5ZWFyIGJl
Zm9yZSBpdC4KLSAgICBpZiAobWF4aW11bVllYXIgPT09IE1vbnRoLk1heGltdW0ueWVhcikKLSAg
ICAgICAgbWF4aW11bVllYXItLTsKKyAgICB2YXIgbW9udGggPSB0aGlzLnBpY2tlci5tYXhpbXVt
TW9udGg7CiAgICAgdmFyIG1heFdpZHRoID0gMDsKICAgICBmb3IgKHZhciBtID0gMDsgbSA8IDEy
OyArK20pIHsKLSAgICAgICAgdGhpcy5fbW9udGgudGV4dENvbnRlbnQgPSBuZXcgTW9udGgobWF4
aW11bVllYXIsIG0pLnRvTG9jYWxlU3RyaW5nKCk7CisgICAgICAgIHRoaXMuX21vbnRoLnRleHRD
b250ZW50ID0gbW9udGgudG9Mb2NhbGVTdHJpbmcoKTsKICAgICAgICAgbWF4V2lkdGggPSBNYXRo
Lm1heChtYXhXaWR0aCwgdGhpcy5fbW9udGgub2Zmc2V0V2lkdGgpOworICAgICAgICBtb250aCA9
IG1vbnRoLnByZXZpb3VzKCk7CiAgICAgfQogICAgIGlmIChnZXRMYW5ndWFnZSgpID09ICJqYSIg
JiYgSW1wZXJpYWxFcmFMaW1pdCA8IG1heGltdW1ZZWFyKSB7CiAgICAgICAgIGZvciAodmFyIG0g
PSAwOyBtIDwgMTI7ICsrbSkgewpAQCAtNjU0LDQ0ICs3NzAsMzAgQEAgWWVhck1vbnRoQ29udHJv
bGxlci5wcm90b3R5cGUuX2F0dGFjaFJpZ2h0QnV0dG9uc1RvID0gZnVuY3Rpb24ocGFyZW50KSB7
CiB9OwogCiAvKioKLSAqIEByZXR1cm4gez9Nb250aH0KLSAqLwotWWVhck1vbnRoQ29udHJvbGxl
ci5wcm90b3R5cGUubW9udGggPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5fY3VycmVu
dE1vbnRoOwotfTsKLQotLyoqCiAgKiBAcGFyYW0geyFNb250aH0gbW9udGgKICAqLwogWWVhck1v
bnRoQ29udHJvbGxlci5wcm90b3R5cGUuc2V0TW9udGggPSBmdW5jdGlvbihtb250aCkgewotICAg
IHRoaXMuX2N1cnJlbnRNb250aCA9IG5ldyBNb250aChtb250aCk7Ci0gICAgdGhpcy5fcmVkcmF3
KCk7Ci19OwotCi1ZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5fcmVkcmF3ID0gZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIG1pbiA9IE1vbnRoLmNyZWF0ZUZyb21EYXRlKHRoaXMucGlja2VyLm1p
bmltdW1EYXRlKS52YWx1ZU9mKCk7Ci0gICAgdmFyIG1heCA9IE1vbnRoLmNyZWF0ZUZyb21EYXRl
KHRoaXMucGlja2VyLm1heGltdW1EYXRlKS52YWx1ZU9mKCk7Ci0gICAgdmFyIGN1cnJlbnQgPSB0
aGlzLl9jdXJyZW50TW9udGgudmFsdWVPZigpOworICAgIHZhciBtb250aFZhbHVlID0gbW9udGgu
dmFsdWVPZigpOwogICAgIGlmICh0aGlzLl9sZWZ0MykKLSAgICAgICAgdGhpcy5fbGVmdDMuZGlz
YWJsZWQgPSBjdXJyZW50IC0gMTMgPCBtaW47Ci0gICAgdGhpcy5fbGVmdDIuZGlzYWJsZWQgPSBj
dXJyZW50IC0gMiA8IG1pbjsKLSAgICB0aGlzLl9sZWZ0MS5kaXNhYmxlZCA9IGN1cnJlbnQgLSAx
IDwgbWluOwotICAgIHRoaXMuX3JpZ2h0MS5kaXNhYmxlZCA9IGN1cnJlbnQgKyAxID4gbWF4Owot
ICAgIHRoaXMuX3JpZ2h0Mi5kaXNhYmxlZCA9IGN1cnJlbnQgKyAyID4gbWF4OworICAgICAgICB0
aGlzLl9sZWZ0My5kaXNhYmxlZCA9ICF0aGlzLnBpY2tlci5zaG91bGRTaG93TW9udGgobmV3IE1v
bnRoKG1vbnRoVmFsdWUgLSAxMykpOworICAgIHRoaXMuX2xlZnQyLmRpc2FibGVkID0gIXRoaXMu
cGlja2VyLnNob3VsZFNob3dNb250aChuZXcgTW9udGgobW9udGhWYWx1ZSAtIDIpKTsKKyAgICB0
aGlzLl9sZWZ0MS5kaXNhYmxlZCA9ICF0aGlzLnBpY2tlci5zaG91bGRTaG93TW9udGgobmV3IE1v
bnRoKG1vbnRoVmFsdWUgLSAxKSk7CisgICAgdGhpcy5fcmlnaHQxLmRpc2FibGVkID0gIXRoaXMu
cGlja2VyLnNob3VsZFNob3dNb250aChuZXcgTW9udGgobW9udGhWYWx1ZSArIDEpKTsKKyAgICB0
aGlzLl9yaWdodDIuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuc2hvdWxkU2hvd01vbnRoKG5ldyBN
b250aChtb250aFZhbHVlICsgMikpOwogICAgIGlmICh0aGlzLl9yaWdodDMpCi0gICAgICAgIHRo
aXMuX3JpZ2h0My5kaXNhYmxlZCA9IGN1cnJlbnQgKyAxMyA+IG1heDsKLSAgICB0aGlzLl9tb250
aC5pbm5lclRleHQgPSB0aGlzLl9jdXJyZW50TW9udGgudG9Mb2NhbGVTdHJpbmcoKTsKKyAgICAg
ICAgdGhpcy5fbGVmdDMuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuc2hvdWxkU2hvd01vbnRoKG5l
dyBNb250aChtb250aFZhbHVlICsgMTMpKTsKKyAgICB0aGlzLl9tb250aC5pbm5lclRleHQgPSBt
b250aC50b0xvY2FsZVN0cmluZygpOwogICAgIHdoaWxlICh0aGlzLl9tb250aFBvcHVwQ29udGVu
dHMuaGFzQ2hpbGROb2RlcygpKQogICAgICAgICB0aGlzLl9tb250aFBvcHVwQ29udGVudHMucmVt
b3ZlQ2hpbGQodGhpcy5fbW9udGhQb3B1cENvbnRlbnRzLmZpcnN0Q2hpbGQpOwogCi0gICAgZm9y
ICh2YXIgbSA9IGN1cnJlbnQgLSA2OyBtIDw9IGN1cnJlbnQgKyA2OyBtKyspIHsKLSAgICAgICAg
aWYgKG0gPCBtaW4gfHwgbSA+IG1heCkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAo
dmFyIG0gPSBtb250aFZhbHVlIC0gNjsgbSA8PSBtb250aFZhbHVlICsgNjsgbSsrKSB7CiAgICAg
ICAgIHZhciBtb250aCA9IG5ldyBNb250aChtKTsKKyAgICAgICAgaWYgKCF0aGlzLnBpY2tlci5z
aG91bGRTaG93TW9udGgobW9udGgpKQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIHZh
ciBvcHRpb24gPSBjcmVhdGVFbGVtZW50KCJkaXYiLCBDbGFzc05hbWVzLk1vbnRoU2VsZWN0b3JQ
b3B1cEVudHJ5LCBtb250aC50b0xvY2FsZVN0cmluZygpKTsKICAgICAgICAgb3B0aW9uLmRhdGFz
ZXQudmFsdWUgPSBtb250aC50b1N0cmluZygpOwogICAgICAgICB0aGlzLl9tb250aFBvcHVwQ29u
dGVudHMuYXBwZW5kQ2hpbGQob3B0aW9uKTsKLSAgICAgICAgaWYgKG0gPT0gY3VycmVudCkKKyAg
ICAgICAgaWYgKG0gPT0gbW9udGhWYWx1ZSkKICAgICAgICAgICAgIG9wdGlvbi5jbGFzc0xpc3Qu
YWRkKENsYXNzTmFtZXMuU2VsZWN0ZWRNb250aFllYXIpOwogICAgIH0KIH07CkBAIC04MTAsNyAr
OTEyLDcgQEAgWWVhck1vbnRoQ29udHJvbGxlci5wcm90b3R5cGUuX2hhbmRsZVllYXJNb250aENo
YW5nZSA9IGZ1bmN0aW9uKCkgewogICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rp
b24oKTsKICAgICBpZiAoIXNlbGVjdGlvbikKICAgICAgICAgcmV0dXJuOwotICAgIHRoaXMucGlj
a2VyLmRheXNUYWJsZS5uYXZpZ2F0ZVRvTW9udGhBbmRLZWVwU2VsZWN0aW9uUG9zaXRpb24oTW9u
dGgucGFyc2Uoc2VsZWN0aW9uLmRhdGFzZXQudmFsdWUpKTsKKyAgICB0aGlzLnBpY2tlci5zaG93
TW9udGgoTW9udGgucGFyc2Uoc2VsZWN0aW9uLmRhdGFzZXQudmFsdWUpKTsKIH07CiAKIC8qCkBA
IC04NjgsMTcgKzk3MCw5IEBAIFllYXJNb250aENvbnRyb2xsZXIucHJvdG90eXBlLl9oYW5kbGVC
dXR0b25DbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgKiBAcGFyYW0geyFudW1iZXJ9IGFtb3Vu
dAogICovCiBZZWFyTW9udGhDb250cm9sbGVyLnByb3RvdHlwZS5tb3ZlUmVsYXRpdmVseSA9IGZ1
bmN0aW9uKGFtb3VudCkgewotICAgIHZhciBtaW4gPSBNb250aC5jcmVhdGVGcm9tRGF0ZSh0aGlz
LnBpY2tlci5taW5pbXVtRGF0ZSkudmFsdWVPZigpOwotICAgIHZhciBtYXggPSBNb250aC5jcmVh
dGVGcm9tRGF0ZSh0aGlzLnBpY2tlci5tYXhpbXVtRGF0ZSkudmFsdWVPZigpOwotICAgIHZhciBj
dXJyZW50ID0gdGhpcy5fY3VycmVudE1vbnRoLnZhbHVlT2YoKTsKLSAgICB2YXIgdXBkYXRlZCA9
IGN1cnJlbnQ7Ci0gICAgaWYgKGFtb3VudCA8IDApCi0gICAgICAgIHVwZGF0ZWQgPSBjdXJyZW50
ICsgYW1vdW50ID49IG1pbiA/IGN1cnJlbnQgKyBhbW91bnQgOiBtaW47Ci0gICAgZWxzZQotICAg
ICAgICB1cGRhdGVkID0gY3VycmVudCArIGFtb3VudCA8PSBtYXggPyBjdXJyZW50ICsgYW1vdW50
IDogbWF4OwotICAgIGlmICh1cGRhdGVkID09IGN1cnJlbnQpCi0gICAgICAgIHJldHVybjsKLSAg
ICB0aGlzLnBpY2tlci5kYXlzVGFibGUubmF2aWdhdGVUb01vbnRoQW5kS2VlcFNlbGVjdGlvblBv
c2l0aW9uKG5ldyBNb250aCh1cGRhdGVkKSk7CisgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnBpY2tl
ci5jdXJyZW50TW9udGgoKS52YWx1ZU9mKCk7CisgICAgdmFyIHVwZGF0ZWQgPSBuZXcgTW9udGgo
Y3VycmVudCArIGFtb3VudCk7CisgICAgdGhpcy5waWNrZXIuc2hvd01vbnRoKHVwZGF0ZWQsIHRy
dWUsIHRydWUpOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODg5LDEwICs5ODMsNiBAQCBZZWFyTW9u
dGhDb250cm9sbGVyLnByb3RvdHlwZS5tb3ZlUmVsYXRpdmVseSA9IGZ1bmN0aW9uKGFtb3VudCkg
ewogICovCiBmdW5jdGlvbiBEYXlzVGFibGUocGlja2VyKSB7CiAgICAgdGhpcy5waWNrZXIgPSBw
aWNrZXI7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgez9Nb250aH0KLSAgICAgKi8KLSAgICB0aGlz
Ll9jdXJyZW50TW9udGggPSBudWxsOwogfQogCiAvKioKQEAgLTk0NywzNiArMTAzNywzNSBAQCBE
YXlzVGFibGUucHJvdG90eXBlLmF0dGFjaFRvID0gZnVuY3Rpb24oZWxlbWVudCkgewogfTsKIAog
LyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHRpbWUgZGF0ZSBpbiBtaWxsaXNlY29uZC4KKyAqIEBw
YXJhbSB7IW51bWJlcn0gdmFsdWUKICAqIEByZXR1cm4geyFib29sZWFufQogICovCi1DYWxlbmRh
clBpY2tlci5wcm90b3R5cGUuc3RlcE1pc21hdGNoID0gZnVuY3Rpb24odGltZSkgewotICAgIHJl
dHVybiAodGltZSAtIHRoaXMuc3RlcEJhc2UpICUgdGhpcy5zdGVwICE9IDA7CitDYWxlbmRhclBp
Y2tlci5wcm90b3R5cGUuX3N0ZXBNaXNtYXRjaCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0
dXJuICh2YWx1ZSAtIHRoaXMuc3RlcEJhc2UpICUgdGhpcy5zdGVwICE9IDA7CiB9CiAKIC8qKgot
ICogQHBhcmFtIHshbnVtYmVyfSB0aW1lIGRhdGUgaW4gbWlsbGlzZWNvbmQuCisgKiBAcGFyYW0g
eyFudW1iZXJ9IHZhbHVlCiAgKiBAcmV0dXJuIHshYm9vbGVhbn0KICAqLwotQ2FsZW5kYXJQaWNr
ZXIucHJvdG90eXBlLm91dE9mUmFuZ2UgPSBmdW5jdGlvbih0aW1lKSB7Ci0gICAgcmV0dXJuIHRp
bWUgPCB0aGlzLm1pbmltdW1EYXRlLmdldFRpbWUoKSB8fCB0aW1lID4gdGhpcy5tYXhpbXVtRGF0
ZS5nZXRUaW1lKCk7CitDYWxlbmRhclBpY2tlci5wcm90b3R5cGUuX291dE9mUmFuZ2UgPSBmdW5j
dGlvbih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSA8IHRoaXMuX21pbmltdW1WYWx1ZSB8fCB2
YWx1ZSA+IHRoaXMuX21heGltdW1WYWx1ZTsKIH0KIAogLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9
IHRpbWUgZGF0ZSBpbiBtaWxsaXNlY29uZC4KKyAqIEBwYXJhbSB7IU1vbnRofERheX0gcmFuZ2UK
ICAqIEByZXR1cm4geyFib29sZWFufQogICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUuaXNW
YWxpZERhdGUgPSBmdW5jdGlvbih0aW1lKSB7Ci0gICAgcmV0dXJuICF0aGlzLm91dE9mUmFuZ2Uo
dGltZSkgJiYgIXRoaXMuc3RlcE1pc21hdGNoKHRpbWUpOworQ2FsZW5kYXJQaWNrZXIucHJvdG90
eXBlLmlzVmFsaWREYXRlID0gZnVuY3Rpb24ocmFuZ2UpIHsKKyAgICB2YXIgdmFsdWUgPSByYW5n
ZS52YWx1ZU9mKCk7CisgICAgcmV0dXJuICF0aGlzLl9vdXRPZlJhbmdlKHZhbHVlKSAmJiAhdGhp
cy5fc3RlcE1pc21hdGNoKHZhbHVlKTsKIH0KIAogLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHll
YXIKLSAqIEBwYXJhbSB7IW51bWJlcn0gbW9udGgKKyAqIEBwYXJhbSB7IU1vbnRofSBtb250aAog
ICovCiBEYXlzVGFibGUucHJvdG90eXBlLl9yZW5kZXJNb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7
Ci0gICAgdGhpcy5fY3VycmVudE1vbnRoID0gbmV3IE1vbnRoKG1vbnRoKTsKLSAgICB2YXIgZGF5
SXRlcmF0b3IgPSB0aGlzLl9jdXJyZW50TW9udGguc3RhcnREYXRlKCk7CisgICAgdmFyIGRheUl0
ZXJhdG9yID0gbW9udGguc3RhcnREYXRlKCk7CiAgICAgdmFyIG1vbnRoU3RhcnREYXkgPSBkYXlJ
dGVyYXRvci5nZXRVVENEYXkoKTsKICAgICB2YXIgd2Vla1N0YXJ0RGF5ID0gZ2xvYmFsLnBhcmFt
cy53ZWVrU3RhcnREYXkgfHwgMDsKICAgICB2YXIgc3RhcnRPZmZzZXQgPSB3ZWVrU3RhcnREYXkg
LSBtb250aFN0YXJ0RGF5OwpAQCAtOTkwLDE1ICsxMDc5LDEzIEBAIERheXNUYWJsZS5wcm90b3R5
cGUuX3JlbmRlck1vbnRoID0gZnVuY3Rpb24obW9udGgpIHsKICAgICAgICAgICAgIHZhciBlbGVt
ZW50ID0gdGhpcy5fZGF5c1t3XVtkXTsKICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJUZXh0ID0g
bG9jYWxpemVOdW1iZXIoZGF5SXRlcmF0b3IuZ2V0VVRDRGF0ZSgpKTsKICAgICAgICAgICAgIGVs
ZW1lbnQuY2xhc3NOYW1lID0gQ2xhc3NOYW1lcy5EYXk7Ci0gICAgICAgICAgICBlbGVtZW50LmRh
dGFzZXQuc3VibWl0VmFsdWUgPSBzZXJpYWxpemVEYXRlKGl0ZXJNb250aC55ZWFyLCBpdGVyTW9u
dGgubW9udGgsIGRheUl0ZXJhdG9yLmdldFVUQ0RhdGUoKSk7CisgICAgICAgICAgICBlbGVtZW50
LmRhdGFzZXQuc3VibWl0VmFsdWUgPSBEYXkuY3JlYXRlRnJvbURhdGUoZGF5SXRlcmF0b3IpLnRv
U3RyaW5nKCk7CiAgICAgICAgICAgICBpZiAoaXNOYU4odGltZSkpIHsKICAgICAgICAgICAgICAg
ICBlbGVtZW50LmlubmVyVGV4dCA9ICItIjsKICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNz
TGlzdC5hZGQoQ2xhc3NOYW1lcy5VbmF2YWlsYWJsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYg
KHRoaXMucGlja2VyLm91dE9mUmFuZ2UodGltZSkpCi0gICAgICAgICAgICAgICAgZWxlbWVudC5j
bGFzc0xpc3QuYWRkKENsYXNzTmFtZXMuVW5hdmFpbGFibGUpOwotICAgICAgICAgICAgZWxzZSBp
ZiAodGhpcy5waWNrZXIuc3RlcE1pc21hdGNoKHRpbWUpKQorICAgICAgICAgICAgfSBlbHNlIGlm
ICghdGhpcy5waWNrZXIuaXNWYWxpZERhdGUoRGF5LmNyZWF0ZUZyb21EYXRlKGRheUl0ZXJhdG9y
KSkpCiAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZXMuVW5h
dmFpbGFibGUpOwotICAgICAgICAgICAgZWxzZSBpZiAoIWl0ZXJNb250aC5lcXVhbHModGhpcy5f
Y3VycmVudE1vbnRoKSkgeworICAgICAgICAgICAgZWxzZSBpZiAoIWl0ZXJNb250aC5lcXVhbHMo
bW9udGgpKSB7CiAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENsYXNzTmFt
ZXMuQXZhaWxhYmxlKTsKICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ2xh
c3NOYW1lcy5Ob3RUaGlzTW9udGgpOwogICAgICAgICAgICAgfSBlbHNlCkBAIC0xMDA3LDMxICsx
MDk0LDI4IEBAIERheXNUYWJsZS5wcm90b3R5cGUuX3JlbmRlck1vbnRoID0gZnVuY3Rpb24obW9u
dGgpIHsKICAgICAgICAgfQogICAgIH0KIAotICAgIHRoaXMucGlja2VyLnRvZGF5LmRpc2FibGVk
ID0gIXRoaXMucGlja2VyLmlzVmFsaWREYXRlKHBhcnNlRGF0ZVN0cmluZygpLmdldFRpbWUoKSk7
CisgICAgdGhpcy5waWNrZXIudG9kYXkuZGlzYWJsZWQgPSAhdGhpcy5waWNrZXIuaXNWYWxpZERh
dGUoRGF5LmNyZWF0ZUZyb21Ub2RheSgpLnZhbHVlT2YoKSk7CiB9OwogCiAvKioKICAqIEBwYXJh
bSB7IU1vbnRofSBtb250aAorICogQHBhcmFtIHshYm9vbH0gYW5pbWF0ZQorICogQHBhcmFtIHsh
Ym9vbH0ga2VlcFNlbGVjdGlvblBvc2l0aW9uCiAgKi8KLURheXNUYWJsZS5wcm90b3R5cGUuX25h
dmlnYXRlVG9Nb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7Ci0gICAgdGhpcy5waWNrZXIueWVhck1v
bnRoQ29udHJvbGxlci5zZXRNb250aChtb250aCk7Ci0gICAgdGhpcy5fcmVuZGVyTW9udGgobW9u
dGgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFNb250aH0gbW9udGgKLSAqLwotRGF5c1RhYmxl
LnByb3RvdHlwZS5fbmF2aWdhdGVUb01vbnRoV2l0aEFuaW1hdGlvbiA9IGZ1bmN0aW9uKG1vbnRo
KSB7Ci0gICAgaWYgKHRoaXMuX2N1cnJlbnRNb250aCkgewotICAgICAgICB2YXIgZGVsdGEgPSB0
aGlzLl9jdXJyZW50TW9udGgudmFsdWVPZigpIC0gbW9udGgudmFsdWVPZigpOwotICAgICAgICBp
ZiAoZGVsdGEgPT09IDApCi0gICAgICAgICAgICByZXR1cm47CitEYXlzVGFibGUucHJvdG90eXBl
Lm5hdmlnYXRlVG9Nb250aCA9IGZ1bmN0aW9uKG1vbnRoLCBhbmltYXRlLCBrZWVwU2VsZWN0aW9u
UG9zaXRpb24pIHsKKyAgICB2YXIgZmlyc3ROb2RlSW5TZWxlY3RlZFJhbmdlID0gdGhpcy5fZmly
c3ROb2RlSW5TZWxlY3RlZFJhbmdlKCk7CisgICAgaWYgKGFuaW1hdGUpIHsKICAgICAgICAgdmFy
IGRheXNTdHlsZSA9IHRoaXMuX2RheXNDb250YWluZXIuc3R5bGU7CiAgICAgICAgIGRheXNTdHls
ZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICAgICAgIGRheXNTdHlsZS53ZWJraXRUcmFuc2l0
aW9uID0gImxlZnQgMC4xcyBlYXNlIjsKLSAgICAgICAgZGF5c1N0eWxlLmxlZnQgPSAoZGVsdGEg
PiAwID8gIiIgOiAiLSIpICsgdGhpcy5fZGF5c0NvbnRhaW5lci5vZmZzZXRXaWR0aCArICJweCI7
CisgICAgICAgIGRheXNTdHlsZS5sZWZ0ID0gKHRoaXMucGlja2VyLmN1cnJlbnRNb250aCgpLnZh
bHVlT2YoKSA+IG1vbnRoLnZhbHVlT2YoKSA/ICIiIDogIi0iKSArIHRoaXMuX2RheXNDb250YWlu
ZXIub2Zmc2V0V2lkdGggKyAicHgiOworICAgIH0KKyAgICB0aGlzLl9yZW5kZXJNb250aChtb250
aCk7CisgICAgaWYgKGtlZXBTZWxlY3Rpb25Qb3NpdGlvbiAmJiBmaXJzdE5vZGVJblNlbGVjdGVk
UmFuZ2UpIHsKKyAgICAgICAgdmFyIHggPSBwYXJzZUludChmaXJzdE5vZGVJblNlbGVjdGVkUmFu
Z2UuZGF0YXNldC5wb3NpdGlvblgsIDEwKTsKKyAgICAgICAgdmFyIHkgPSBwYXJzZUludChmaXJz
dE5vZGVJblNlbGVjdGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblksIDEwKTsKKyAgICAgICAgdGhp
cy5fc2VsZWN0UmFuZ2VBdFBvc2l0aW9uKHgsIHkpOwogICAgIH0KLSAgICB0aGlzLl9uYXZpZ2F0
ZVRvTW9udGgobW9udGgpOwogfTsKIAogRGF5c1RhYmxlLnByb3RvdHlwZS5fbW92ZUluRGF5cyA9
IGZ1bmN0aW9uKCkgewpAQCAtMTA0NiwyNyArMTEzMCwxMiBAQCBEYXlzVGFibGUucHJvdG90eXBl
Ll9tb3ZlSW5EYXlzID0gZnVuY3Rpb24oKSB7CiB9OwogCiAvKioKLSAqIEBwYXJhbSB7IU1vbnRo
fSBtb250aAotICovCi1EYXlzVGFibGUucHJvdG90eXBlLm5hdmlnYXRlVG9Nb250aEFuZEtlZXBT
ZWxlY3Rpb25Qb3NpdGlvbiA9IGZ1bmN0aW9uKG1vbnRoKSB7Ci0gICAgaWYgKHRoaXMuX2N1cnJl
bnRNb250aC5lcXVhbHMobW9udGgpKQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGZpcnN0Tm9k
ZUluU2VsZWN0ZWRSYW5nZSA9IHRoaXMuX2ZpcnN0Tm9kZUluU2VsZWN0ZWRSYW5nZSgpOwotICAg
IHRoaXMuX25hdmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24obW9udGgpOwotICAgIGlmIChmaXJz
dE5vZGVJblNlbGVjdGVkUmFuZ2UpIHsKLSAgICAgICAgdmFyIHggPSBwYXJzZUludChmaXJzdE5v
ZGVJblNlbGVjdGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblgsIDEwKTsKLSAgICAgICAgdmFyIHkg
PSBwYXJzZUludChmaXJzdE5vZGVJblNlbGVjdGVkUmFuZ2UuZGF0YXNldC5wb3NpdGlvblksIDEw
KTsKLSAgICAgICAgdGhpcy5fc2VsZWN0UmFuZ2VBdFBvc2l0aW9uKHgsIHkpOwotICAgIH0KLX07
Ci0KLS8qKgogICogQHBhcmFtIHshRGF0ZX0gZGF0ZQogICovCi1EYXlzVGFibGUucHJvdG90eXBl
LnNlbGVjdERhdGUgPSBmdW5jdGlvbihkYXRlKSB7CitEYXlzVGFibGUucHJvdG90eXBlLnNlbGVj
dFJhbmdlID0gZnVuY3Rpb24oZGF5KSB7CiAgICAgdGhpcy5fZGVzZWxlY3QoKTsKLSAgICB0aGlz
Ll9uYXZpZ2F0ZVRvTW9udGhXaXRoQW5pbWF0aW9uKE1vbnRoLmNyZWF0ZUZyb21EYXRlKGRhdGUp
KTsKLSAgICB2YXIgZGF0ZVN0cmluZyA9IHNlcmlhbGl6ZURhdGUoZGF0ZS5nZXRVVENGdWxsWWVh
cigpLCBkYXRlLmdldFVUQ01vbnRoKCksIGRhdGUuZ2V0VVRDRGF0ZSgpKTsKKyAgICB0aGlzLnBp
Y2tlci5zaG93TW9udGgoTW9udGguY3JlYXRlRnJvbURhdGUoZGF5LnN0YXJ0RGF0ZSgpKSwgdHJ1
ZSk7CisgICAgdmFyIGRhdGVTdHJpbmcgPSBkYXkudG9TdHJpbmcoKTsKICAgICBmb3IgKHZhciB3
ID0gMDsgdyA8IERheXNUYWJsZS5fV2Vla3M7IHcrKykgewogICAgICAgICBmb3IgKHZhciBkID0g
MDsgZCA8IDc7IGQrKykgewogICAgICAgICAgICAgaWYgKHRoaXMuX2RheXNbd11bZF0uZGF0YXNl
dC5zdWJtaXRWYWx1ZSA9PSBkYXRlU3RyaW5nKSB7CkBAIC0xMTEzLDEwICsxMTgyLDEwIEBAIERh
eXNUYWJsZS5wcm90b3R5cGUuX2Rlc2VsZWN0ID0gZnVuY3Rpb24oKSB7CiAgKiBAcmV0dXJuIHsh
Ym9vbGVhbn0KICAqLwogRGF5c1RhYmxlLnByb3RvdHlwZS5fbWF5YmVTZXRQcmV2aW91c01vbnRo
ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGN1cnJlbnRNb250aCA9IHRoaXMucGlja2VyLnllYXJN
b250aENvbnRyb2xsZXIubW9udGgoKTsKLSAgICBpZiAodGhpcy5waWNrZXIubWluaW11bURhdGUg
Pj0gY3VycmVudE1vbnRoLnN0YXJ0RGF0ZSgpKQorICAgIHZhciBwcmV2aW91c01vbnRoID0gdGhp
cy5waWNrZXIuY3VycmVudE1vbnRoKCkucHJldmlvdXMoKTsKKyAgICBpZiAoIXRoaXMucGlja2Vy
LnNob3VsZFNob3dNb250aChwcmV2aW91c01vbnRoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIHRoaXMuX25hdmlnYXRlVG9Nb250aFdpdGhBbmltYXRpb24oY3VycmVudE1vbnRoLnByZXZp
b3VzKCkpOworICAgIHRoaXMucGlja2VyLnNob3dNb250aChwcmV2aW91c01vbnRoLCB0cnVlKTsK
ICAgICByZXR1cm4gdHJ1ZTsKIH07CiAKQEAgLTExMjQsMTAgKzExOTMsMTAgQEAgRGF5c1RhYmxl
LnByb3RvdHlwZS5fbWF5YmVTZXRQcmV2aW91c01vbnRoID0gZnVuY3Rpb24oKSB7CiAgKiBAcmV0
dXJuIHshYm9vbGVhbn0KICAqLwogRGF5c1RhYmxlLnByb3RvdHlwZS5fbWF5YmVTZXROZXh0TW9u
dGggPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgY3VycmVudE1vbnRoID0gdGhpcy5waWNrZXIueWVh
ck1vbnRoQ29udHJvbGxlci5tb250aCgpOwotICAgIGlmICh0aGlzLnBpY2tlci5tYXhpbXVtRGF0
ZSA8IGN1cnJlbnRNb250aC5lbmREYXRlKCkpCisgICAgdmFyIG5leHRNb250aCA9IHRoaXMucGlj
a2VyLmN1cnJlbnRNb250aCgpLm5leHQoKTsKKyAgICBpZiAoIXRoaXMucGlja2VyLnNob3VsZFNo
b3dNb250aChuZXh0TW9udGgpKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdGhpcy5fbmF2
aWdhdGVUb01vbnRoV2l0aEFuaW1hdGlvbihjdXJyZW50TW9udGgubmV4dCgpKTsKKyAgICB0aGlz
LnBpY2tlci5zaG93TW9udGgobmV4dE1vbnRoLCB0cnVlKTsKICAgICByZXR1cm4gdHJ1ZTsKIH07
CiAKQEAgLTEyMzcsNyArMTMwNiw3IEBAIERheXNUYWJsZS5wcm90b3R5cGUuX2hhbmRsZUtleSA9
IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgIH0KIAogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJV
KzAwNTQiKSB7IC8vICd0JwotICAgICAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUoKSk7Cisg
ICAgICAgIHRoaXMuc2VsZWN0UmFuZ2UoRGF5LmNyZWF0ZUZyb21Ub2RheSgpKTsKICAgICAgICAg
ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7
CiAgICAgfQpAQCAtMTI3MSwxMSArMTM0MCwxMSBAQCBDYWxlbmRhclBpY2tlci5wcm90b3R5cGUu
X2hhbmRsZUJvZHlLZXlEb3duID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgIHRoaXMu
bGFzdEZvY3VzYWJsZUNvbnRyb2wuZm9jdXMoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAo
a2V5ID09ICJVKzAwNEQiKSB7IC8vICdtJwotICAgICAgICB0aGlzLnllYXJNb250aENvbnRyb2xs
ZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlBy
ZXZpb3VzTW9udGggOiBZZWFyTW9udGhDb250cm9sbGVyLk5leHRNb250aCk7CisgICAgICAgIHRo
aXMuX3llYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZ
ZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzTW9udGggOiBZZWFyTW9udGhDb250cm9sbGVyLk5l
eHRNb250aCk7CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gIlUrMDA1OSIpIHsgLy8gJ3knCi0gICAg
ICAgIHRoaXMueWVhck1vbnRoQ29udHJvbGxlci5tb3ZlUmVsYXRpdmVseShldmVudC5zaGlmdEtl
eSA/IFllYXJNb250aENvbnRyb2xsZXIuUHJldmlvdXNZZWFyIDogWWVhck1vbnRoQ29udHJvbGxl
ci5OZXh0WWVhcik7CisgICAgICAgIHRoaXMuX3llYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0
aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzWWVhciA6
IFllYXJNb250aENvbnRyb2xsZXIuTmV4dFllYXIpOwogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJV
KzAwNDQiKSB7IC8vICdkJwotICAgICAgICB0aGlzLnllYXJNb250aENvbnRyb2xsZXIubW92ZVJl
bGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFyTW9udGhDb250cm9sbGVyLlByZXZpb3VzVGVu
WWVhcnMgOiBZZWFyTW9udGhDb250cm9sbGVyLk5leHRUZW5ZZWFycyk7CisgICAgICAgIHRoaXMu
X3llYXJNb250aENvbnRyb2xsZXIubW92ZVJlbGF0aXZlbHkoZXZlbnQuc2hpZnRLZXkgPyBZZWFy
TW9udGhDb250cm9sbGVyLlByZXZpb3VzVGVuWWVhcnMgOiBZZWFyTW9udGhDb250cm9sbGVyLk5l
eHRUZW5ZZWFycyk7CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gIlUrMDAxQiIpIC8vIEVTQwogICAg
ICAgICB0aGlzLmhhbmRsZUNhbmNlbCgpOwogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>