<?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>107740</bug_id>
          
          <creation_ts>2013-01-23 14:41:23 -0800</creation_ts>
          <short_desc>Share code between the different min-content / max-content code paths</short_desc>
          <delta_ts>2013-01-25 17:53:45 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>103311</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Julien Chaffraix">jchaffraix</reporter>
          <assigned_to name="Julien Chaffraix">jchaffraix</assigned_to>
          <cc>eric</cc>
    
    <cc>ojan.autocc</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>814656</commentid>
    <comment_count>0</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2013-01-23 14:41:23 -0800</bug_when>
    <thetext>Currently the min-content / max-content implementation is copied and pasted between the different branches in resolveContentBasedTrackSizingFunctions.

To ease maintenance and match the specification more closely, all the code paths should rely on the same primitives, using some parametrization to tweak the behavior as needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>814755</commentid>
    <comment_count>1</comment_count>
      <attachid>184332</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2013-01-23 15:44:29 -0800</bug_when>
    <thetext>Created attachment 184332
Proposed change 1: Use some template magic to merge the different branches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>814776</commentid>
    <comment_count>2</comment_count>
      <attachid>184332</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2013-01-23 16:10:33 -0800</bug_when>
    <thetext>Comment on attachment 184332
Proposed change 1: Use some template magic to merge the different branches.

Why did you decide to use a template rather than passing in parameters and using if()s in resolveContentBasedTrackSizingFunctionsForItems?  This doesn&apos;t look that performance sensitive and I think it would be easier to read the code without templates.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>814867</commentid>
    <comment_count>3</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2013-01-23 17:23:29 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 184332 [details])
&gt; Why did you decide to use a template rather than passing in parameters and using if()s in resolveContentBasedTrackSizingFunctionsForItems?  This doesn&apos;t look that performance sensitive and I think it would be easier to read the code without templates.

I could be convinced otherwise but it looked cleaner to use a template for the following reasons:
- Less arguments: we already have a lot of arguments and adding 2 more is going to add more pain.
- If you pass the Accumulator as an argument, you need to pass an instance of it -  meaning the need for a base class and more boiler plate code  - or 2 function pointers - even *more* arguments.
- Code reuse: I am pretty sure we will need to re-use distributeSpaceToTracks in resolveContentBasedTrackSizingFunctionsForItems. The 2 previous argument-based solutions would yield to more duplication or if()&apos;s.
- Less branches: from a readability perspective, what you are proposing will yield to lots of if()&apos;s.
- Conceptually, it&apos;s really a core algorithm that you specialize using some trait class (see the HashTraits / VectorTraits in WTF for example).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>815953</commentid>
    <comment_count>4</comment_count>
      <attachid>184332</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2013-01-24 16:24:33 -0800</bug_when>
    <thetext>Comment on attachment 184332
Proposed change 1: Use some template magic to merge the different branches.

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

I still think using parameters would be easier to read.  This is my proposal:

Make an Accumulator interface and have MaxBreadthAccumulator and UsedBreadthAccumulator inherit from it.  You could CREATE_STATIC_LOCAL them in resolveContentBasedTrackSizingFunctionsForItems, although stack allocating doesn&apos;t seem like a big deal to me.

Pass in an enum for which Accumulator you want to use.  In the beginning of resolveContentBasedTrackSizingFunctionsForItems use a ternary to set a locale reference to the right one.

MinContentFunction / MaxContentFunction is already just an enum with a ternary in the code. Switching it to a parameter would not change the function body, although it would be an extra branch at runtime.

The result would be the 2 template parameters are now function parameters.  They&apos;re enums, so it&apos;s that different to read and you&apos;ll get nice compiler warnings if you misplace them (same as template params).

This adds 1 new ternary branch at the beginning of resolveContentBasedTrackSizingFunctionsForItems for the accumulator and there will be virtual dispatch for the methods on the accumulator.  If you have some data suggesting that this is going to be the bottleneck during layout (e.g., if you had n grid cells, this will be run n^2 times), I could probably be convinced into turning this into a template parameter.

In Flexbox, we were worried that we would spend a lot of time in flex layout and would try to avoid looping over the children.  We added some perf tests and it turned out that looping over your children is way faster than say, layout out some text.

&gt; Source/WebCore/rendering/RenderGrid.cpp:63
&gt; +    static LayoutUnit value(GridTrack&amp; track) { return track.m_usedBreadth; }

Nit: const GridTrack&amp; track</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>816055</commentid>
    <comment_count>5</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2013-01-24 18:12:21 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 184332 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=184332&amp;action=review
&gt; 
&gt; I still think using parameters would be easier to read.  This is my proposal:
&gt; 
&gt; Make an Accumulator interface and have MaxBreadthAccumulator and UsedBreadthAccumulator inherit from it.  You could CREATE_STATIC_LOCAL them in resolveContentBasedTrackSizingFunctionsForItems, although stack allocating doesn&apos;t seem like a big deal to me.
&gt; 
&gt; Pass in an enum for which Accumulator you want to use.  In the beginning of resolveContentBasedTrackSizingFunctionsForItems use a ternary to set a locale reference to the right one.
&gt; 
&gt; MinContentFunction / MaxContentFunction is already just an enum with a ternary in the code. Switching it to a parameter would not change the function body, although it would be an extra branch at runtime.
&gt; 
&gt; The result would be the 2 template parameters are now function parameters.  They&apos;re enums, so it&apos;s that different to read and you&apos;ll get nice compiler warnings if you misplace them (same as template params).

Your proposal really feels like a poor man&apos;s version of the template: we still pass more parameters and need more boiler-plate code (base class + inheritance, some static instance or stack allocations). We may as well just pass function pointers in this case as it would remove the need for much of the boiler-plate code.

&gt; This adds 1 new ternary branch at the beginning of resolveContentBasedTrackSizingFunctionsForItems for the accumulator and there will be virtual dispatch for the methods on the accumulator.  If you have some data suggesting that this is going to be the bottleneck during layout (e.g., if you had n grid cells, this will be run n^2 times), I could probably be convinced into turning this into a template parameter.
&gt; 
&gt; In Flexbox, we were worried that we would spend a lot of time in flex layout and would try to avoid looping over the children.  We added some perf tests and it turned out that looping over your children is way faster than say, layout out some text.

I totally agree that performance claims should be based on data but I wasn&apos;t making any.

The goal was to be pragmatic and use the best tool for the job as templates:
* don&apos;t create as much boiler-plate code as a class hierarchy would.
* don&apos;t add at least 3 parameters to the functions that starts to have too many arguments as a function pointers&apos; approach. You also have to think about what&apos;s coming: distributeSpaceToTracks requires 5 arguments in the specification, which could easily end up being 8+ arguments if we are not careful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>816666</commentid>
    <comment_count>6</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2013-01-25 09:44:58 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; The goal was to be pragmatic and use the best tool for the job as templates:
&gt; * don&apos;t create as much boiler-plate code as a class hierarchy would.
&gt; * don&apos;t add at least 3 parameters to the functions that starts to have too many arguments as a function pointers&apos; approach. You also have to think about what&apos;s coming: distributeSpaceToTracks requires 5 arguments in the specification, which could easily end up being 8+ arguments if we are not careful.

It seems like we could have the same number of arguments as the template version, it&apos;s just a question of whether it&apos;s a template argument or a function argument.  Also, it would be fine to create a struct to hold related arguments and pass that as an argument to make it easier to read like we do in other parts of the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>816936</commentid>
    <comment_count>7</comment_count>
      <attachid>184813</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2013-01-25 14:55:37 -0800</bug_when>
    <thetext>Created attachment 184813
Proposed change v2: Use function pointers instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>817096</commentid>
    <comment_count>8</comment_count>
      <attachid>184813</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-25 17:53:42 -0800</bug_when>
    <thetext>Comment on attachment 184813
Proposed change v2: Use function pointers instead.

Clearing flags on attachment: 184813

Committed r140894: &lt;http://trac.webkit.org/changeset/140894&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>817097</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-25 17:53:45 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>184332</attachid>
            <date>2013-01-23 15:44:29 -0800</date>
            <delta_ts>2013-01-25 14:55:35 -0800</delta_ts>
            <desc>Proposed change 1: Use some template magic to merge the different branches.</desc>
            <filename>bug-107740-20130123154121.patch</filename>
            <type>text/plain</type>
            <size>11172</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQwNTk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjRmMDNhNTMwY2U3NzZj
OWFhM2QxMjZkYzY0M2U4NmRhYTA4ODU3OC4uNDg3MjE3N2NkNGE5OTZmYTlmOGI4YmE3Zjc1N2Iz
ZjU5ZmNlY2U5OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQxIEBACisyMDEzLTAxLTIzICBKdWxp
ZW4gQ2hhZmZyYWl4ICA8amNoYWZmcmFpeEB3ZWJraXQub3JnPgorCisgICAgICAgIFNoYXJlIGNv
ZGUgYmV0d2VlbiB0aGUgZGlmZmVyZW50IG1pbi1jb250ZW50IC8gbWF4LWNvbnRlbnQgY29kZSBw
YXRocworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA3
NzQwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhp
cyBjb2RlIHVzZXMgc29tZSB0ZW1wbGF0ZSBtYWdpYyB0byBwYXJhbWV0cml6ZSB0aGUgY29yZSBj
b250ZW50IHJlc29sdXRpb24gYWxnb3JpdGhtLgorICAgICAgICBUaGlzIGVuYWJsZXMgdXMgdG8g
c2hhcmUgY29kZSBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgY29udGVudCBiYXNlZCBjb21wdXRhdGlv
bnMuCisKKyAgICAgICAgUmVmYWN0b3JpbmcsIGNvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMuCisK
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyR3JpZC5jcHA6CisgICAgICAgIChVc2VkQnJlYWR0
aEFjY3VtdWxhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlVzZWRCcmVhZHRoQWNjdW11bGF0b3I6
Omdyb3cpOgorICAgICAgICAoV2ViQ29yZTo6VXNlZEJyZWFkdGhBY2N1bXVsYXRvcjo6dmFsdWUp
OgorICAgICAgICAoV2ViQ29yZTo6VXNlZEJyZWFkdGhBY2N1bXVsYXRvcjo6c2hvdWxkVXBkYXRl
QXZhaWxhYmxlTG9naWNhbFNwYWNlKToKKyAgICAgICAgKE1heEJyZWFkdGhBY2N1bXVsYXRvcik6
CisgICAgICAgIChXZWJDb3JlOjpNYXhCcmVhZHRoQWNjdW11bGF0b3I6Omdyb3cpOgorICAgICAg
ICAoV2ViQ29yZTo6TWF4QnJlYWR0aEFjY3VtdWxhdG9yOjp2YWx1ZSk6CisgICAgICAgIChXZWJD
b3JlOjpNYXhCcmVhZHRoQWNjdW11bGF0b3I6OnNob3VsZFVwZGF0ZUF2YWlsYWJsZUxvZ2ljYWxT
cGFjZSk6CisgICAgICAgIEFkZGVkIHRoZSAyIEFjY3VtdWxhdG9yIHVzZWQgaW4gdGhlIGFsZ29y
aXRobSAodGhlIG5hbWluZyBpcyB0YWtlbiBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uKS4KKyAgICAg
ICAgVGhlaXIgZ29hbCBpcyB0byB3cmFwIHRoZSB0cmFjayBnZXR0ZXJzIC8gc2V0dGVycyB0byBw
cm92aWRlIGN1c3RvbWl6YXRpb24gaW4gdGhlIGNvcmUKKyAgICAgICAgZnVuY3Rpb25zJyBiZWhh
dmlvci4gSSBhZGRlZCBzaG91bGRVcGRhdGVBdmFpbGFibGVMb2dpY2FsU3BhY2UgdG8gdXBkYXRl
IHRoZSBhdmFpbGFibGUKKyAgICAgICAgbG9naWNhbCBzcGFjZSBpbmRlcGVuZGVudGx5LiBUaGlz
IG1ha2VzIGl0IGVhc2llciB0byBzaGFyZSBjb2RlIHdpdGggZGlzdHJpYnV0ZVNwYWNlVG9UcmFj
a3MuCisKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckdyaWQ6OnJlc29sdmVDb250ZW50QmFzZWRU
cmFja1NpemluZ0Z1bmN0aW9ucyk6CisgICAgICAgIFVwZGF0ZWQgdG8gdXNlIHRoZSB0ZW1wbGF0
aXplZCByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyBpbnN0
ZWFkIG9mCisgICAgICAgIGR1cGxpY2F0aW5nIGNvZGUuIE9uZSBjaGFuZ2UgaXMgdGhhdCBub3cs
IHdlIHByb3Blcmx5IGFwcGx5IHRoZSBtaW4gb24gYWxsIGJyYW5jaGVzLCB3aGljaAorICAgICAg
ICB3YXMgYW4gb3ZlcnNpZ2h0IG9mIHRoZSBwcmV2aW91cyBwYXRjaGVzLgorCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJHcmlkOjpyZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlv
bnNGb3JJdGVtcyk6CisgICAgICAgIEFkZGVkIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGNvcmUgY29u
dGVudC1zaXplZCByZXNvbHV0aW9uIGZ1bmN0aW9uLiBGb3Igbm93LCB3ZSBwYXNzIHRoZQorICAg
ICAgICBjdXJyZW50IHRyYWNrIGJ5IGRpcmVjdGlvbiAmIGluZGV4IHRvIGJlIGFibGUgdG8gZmls
dGVyIGdyaWQgaXRlbXMuCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyR3JpZC5oOgorICAg
ICAgICBBZGRlZCByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVt
cy4KKwogMjAxMy0wMS0yMyAgSnVuIEppYW5nICA8anVuLmEuamlhbmdAaW50ZWwuY29tPgogCiAg
ICAgICAgIEF2b2lkIHVubmVjZXNzYXJ5IGZvcm1hdCBjb252ZXJzaW9uIGZvciB0ZXh7U3VifUlt
YWdlMkQoKSBmb3IgSW1hZ2VEYXRhIG9mIFdlYkdMCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyR3JpZC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyR3JpZC5jcHAKaW5kZXggZWQ3NjcwZWEwNGUwODRmZTgwYWRkNGZmOGNhZWZhY2EyNWVjNTIz
MS4uZjZmZmMzNDIxNDZhZWE5ZGE0NjA1ZTQ0Y2Q0OGU4NzJmMjJiNTJlYSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQuY3BwCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmNwcApAQCAtNTIsNiArNTIsMzUgQEAgcHVibGljOgog
ICAgIExheW91dFVuaXQgbV9tYXhCcmVhZHRoOwogfTsKIAorY2xhc3MgVXNlZEJyZWFkdGhBY2N1
bXVsYXRvciB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZ3JvdyhHcmlkVHJhY2smIHRyYWNr
LCBMYXlvdXRVbml0IGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UpCisgICAgeworICAgICAgICBBU1NF
UlQoYWRkaXRpb25hbEJyZWFkdGhTcGFjZSA+PSAwKTsKKyAgICAgICAgdHJhY2subV91c2VkQnJl
YWR0aCArPSBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlOworICAgIH0KKworICAgIHN0YXRpYyBMYXlv
dXRVbml0IHZhbHVlKEdyaWRUcmFjayYgdHJhY2spIHsgcmV0dXJuIHRyYWNrLm1fdXNlZEJyZWFk
dGg7IH0KKworICAgIHN0YXRpYyBib29sIHNob3VsZFVwZGF0ZUF2YWlsYWJsZUxvZ2ljYWxTcGFj
ZSgpIHsgcmV0dXJuIHRydWU7IH0KK307CisKK2NsYXNzIE1heEJyZWFkdGhBY2N1bXVsYXRvciB7
CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZ3JvdyhHcmlkVHJhY2smIHRyYWNrLCBMYXlvdXRV
bml0IGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UpCisgICAgeworICAgICAgICBpZiAodHJhY2subV9t
YXhCcmVhZHRoID09IGluZmluaXR5KQorICAgICAgICAgICAgdHJhY2subV9tYXhCcmVhZHRoID0g
dHJhY2subV91c2VkQnJlYWR0aCArIGFkZGl0aW9uYWxCcmVhZHRoU3BhY2U7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHRyYWNrLm1fbWF4QnJlYWR0aCArPSBhZGRpdGlvbmFsQnJlYWR0aFNw
YWNlOworICAgIH0KKworICAgIHN0YXRpYyBMYXlvdXRVbml0IHZhbHVlKEdyaWRUcmFjayYgdHJh
Y2spIHsgcmV0dXJuIHRyYWNrLm1heEJyZWFkdGhJZk5vdEluZmluaXRlKCk7IH0KKworICAgIC8v
IE1heCBicmVhZHRoIGNvbXB1dGF0aW9uIGRvbid0IGltcGFjdCB0aGUgdXNlZCBicmVhZHRoIGFu
ZCB0aHVzIGRvbid0IHVwZGF0ZSB0aGUgYXZhaWxhYmxlIGxvZ2ljYWwgc3BhY2UuCisgICAgc3Rh
dGljIGJvb2wgc2hvdWxkVXBkYXRlQXZhaWxhYmxlTG9naWNhbFNwYWNlKCkgeyByZXR1cm4gZmFs
c2U7IH0KK307CisKIFJlbmRlckdyaWQ6OlJlbmRlckdyaWQoRWxlbWVudCogZWxlbWVudCkKICAg
ICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCiB7CkBAIC0yNjksNzAgKzI5OCw0NCBAQCB2b2lkIFJl
bmRlckdyaWQ6OnJlc29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9ucyhUcmFja1Np
emluZ0RpcmVjdGlvbiBkaQogICAgIFZlY3RvcjxHcmlkVHJhY2s+JiB0cmFja3MgPSAoZGlyZWN0
aW9uID09IEZvckNvbHVtbnMpID8gY29sdW1uVHJhY2tzIDogcm93VHJhY2tzOwogCiAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCB0cmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgR3JpZFRy
YWNrJiB0cmFjayA9IHRyYWNrc1tpXTsKICAgICAgICAgY29uc3QgTGVuZ3RoJiBtaW5UcmFja0Jy
ZWFkdGggPSB0cmFja1N0eWxlc1tpXS5taW5UcmFja0JyZWFkdGgoKTsKLSAgICAgICAgaWYgKG1p
blRyYWNrQnJlYWR0aC5pc01pbkNvbnRlbnQoKSB8fCBtaW5UcmFja0JyZWFkdGguaXNNYXhDb250
ZW50KCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGUgc3BlY2lmaWNhdGlvbiBmYWN0b3Jz
IHRoaXMgbG9naWMgaW50byByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNG
b3JJdGVtcwotICAgICAgICAgICAgLy8gdG8gcmV1c2UgY29kZSBiZXR3ZWVuIHRoZSBicmFuY2hl
cyBhbmQgYWxzbyBjYWxscyBkaXN0cmlidXRlU3BhY2VUb1RyYWNrcy4KLSAgICAgICAgICAgIGZv
ciAoUmVuZGVyQm94KiBjaGlsZCA9IGZpcnN0Q2hpbGRCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hp
bGQtPm5leHRTaWJsaW5nQm94KCkpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY2VsbEluZGV4
ID0gcmVzb2x2ZUdyaWRQb3NpdGlvbihkaXJlY3Rpb24sIGNoaWxkKTsKLSAgICAgICAgICAgICAg
ICBpZiAoY2VsbEluZGV4ICE9IGkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlID0gbWluQ29u
dGVudEZvckNoaWxkKGNoaWxkLCBkaXJlY3Rpb24sIGNvbHVtblRyYWNrcykgLSB0cmFjay5tX3Vz
ZWRCcmVhZHRoOwotICAgICAgICAgICAgICAgIEFTU0VSVChhZGRpdGlvbmFsQnJlYWR0aFNwYWNl
ID49IDApOwotICAgICAgICAgICAgICAgIHRyYWNrLm1fdXNlZEJyZWFkdGggKz0gYWRkaXRpb25h
bEJyZWFkdGhTcGFjZTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsU3BhY2UgLT0g
YWRkaXRpb25hbEJyZWFkdGhTcGFjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
ICBpZiAobWluVHJhY2tCcmVhZHRoLmlzTWF4Q29udGVudCgpKSB7Ci0gICAgICAgICAgICBmb3Ig
KFJlbmRlckJveCogY2hpbGQgPSBmaXJzdENoaWxkQm94KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZ0JveCgpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNlbGxJbmRleCA9
IHJlc29sdmVHcmlkUG9zaXRpb24oKGRpcmVjdGlvbiA9PSBGb3JDb2x1bW5zKSA/IGNoaWxkLT5z
dHlsZSgpLT5ncmlkSXRlbUNvbHVtbigpIDogY2hpbGQtPnN0eWxlKCktPmdyaWRJdGVtUm93KCkp
OwotICAgICAgICAgICAgICAgIGlmIChjZWxsSW5kZXggIT0gaSkKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGFkZGl0aW9uYWxCcmVh
ZHRoU3BhY2UgPSBtYXhDb250ZW50Rm9yQ2hpbGQoY2hpbGQsIGRpcmVjdGlvbiwgY29sdW1uVHJh
Y2tzKSAtIHRyYWNrLm1fdXNlZEJyZWFkdGg7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGFkZGl0
aW9uYWxCcmVhZHRoU3BhY2UgPj0gMCk7Ci0gICAgICAgICAgICAgICAgdHJhY2subV91c2VkQnJl
YWR0aCArPSBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlOwotICAgICAgICAgICAgICAgIGF2YWlsYWJs
ZUxvZ2ljYWxTcGFjZSAtPSBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlOwotICAgICAgICAgICAgfQot
ICAgICAgICB9CisgICAgICAgIGlmIChtaW5UcmFja0JyZWFkdGguaXNNaW5Db250ZW50KCkgfHwg
bWluVHJhY2tCcmVhZHRoLmlzTWF4Q29udGVudCgpKQorICAgICAgICAgICAgcmVzb2x2ZUNvbnRl
bnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXM8VXNlZEJyZWFkdGhBY2N1bXVsYXRv
ciwgTWluQ29udGVudEZ1bmN0aW9uPihkaXJlY3Rpb24sIGNvbHVtblRyYWNrcywgcm93VHJhY2tz
LCBpLCBhdmFpbGFibGVMb2dpY2FsU3BhY2UpOworCisgICAgICAgIGlmIChtaW5UcmFja0JyZWFk
dGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tT
aXppbmdGdW5jdGlvbnNGb3JJdGVtczxVc2VkQnJlYWR0aEFjY3VtdWxhdG9yLCBNYXhDb250ZW50
RnVuY3Rpb24+KGRpcmVjdGlvbiwgY29sdW1uVHJhY2tzLCByb3dUcmFja3MsIGksIGF2YWlsYWJs
ZUxvZ2ljYWxTcGFjZSk7CiAKICAgICAgICAgY29uc3QgTGVuZ3RoJiBtYXhUcmFja0JyZWFkdGgg
PSB0cmFja1N0eWxlc1tpXS5tYXhUcmFja0JyZWFkdGgoKTsKLSAgICAgICAgaWYgKG1heFRyYWNr
QnJlYWR0aC5pc01pbkNvbnRlbnQoKSB8fCBtYXhUcmFja0JyZWFkdGguaXNNYXhDb250ZW50KCkp
IHsKLSAgICAgICAgICAgIGZvciAoUmVuZGVyQm94KiBjaGlsZCA9IGZpcnN0Q2hpbGRCb3goKTsg
Y2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCkpIHsKLSAgICAgICAgICAgICAg
ICBzaXplX3QgY2VsbEluZGV4ID0gcmVzb2x2ZUdyaWRQb3NpdGlvbihkaXJlY3Rpb24sIGNoaWxk
KTsKLSAgICAgICAgICAgICAgICBpZiAoY2VsbEluZGV4ICE9IGkpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBhZGRpdGlvbmFsQnJl
YWR0aFNwYWNlID0gbWluQ29udGVudEZvckNoaWxkKGNoaWxkLCBkaXJlY3Rpb24sIGNvbHVtblRy
YWNrcykgLSB0cmFjay5tYXhCcmVhZHRoSWZOb3RJbmZpbml0ZSgpOwotICAgICAgICAgICAgICAg
IExheW91dFVuaXQgc2hhcmUgPSBzdGQ6Om1pbihhZGRpdGlvbmFsQnJlYWR0aFNwYWNlLCB0cmFj
a3NbaV0ubV9tYXhCcmVhZHRoIC0gdHJhY2subWF4QnJlYWR0aElmTm90SW5maW5pdGUoKSk7Ci0g
ICAgICAgICAgICAgICAgaWYgKHRyYWNrLm1fbWF4QnJlYWR0aCA9PSBpbmZpbml0eSkKLSAgICAg
ICAgICAgICAgICAgICAgdHJhY2subV9tYXhCcmVhZHRoID0gdHJhY2subV91c2VkQnJlYWR0aCAr
IHNoYXJlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHJhY2su
bV9tYXhCcmVhZHRoICs9IHNoYXJlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAg
IGlmIChtYXhUcmFja0JyZWFkdGguaXNNaW5Db250ZW50KCkgfHwgbWF4VHJhY2tCcmVhZHRoLmlz
TWF4Q29udGVudCgpKQorICAgICAgICAgICAgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5n
RnVuY3Rpb25zRm9ySXRlbXM8TWF4QnJlYWR0aEFjY3VtdWxhdG9yLCBNaW5Db250ZW50RnVuY3Rp
b24+KGRpcmVjdGlvbiwgY29sdW1uVHJhY2tzLCByb3dUcmFja3MsIGksIGF2YWlsYWJsZUxvZ2lj
YWxTcGFjZSk7CiAKLSAgICAgICAgaWYgKG1heFRyYWNrQnJlYWR0aC5pc01heENvbnRlbnQoKSkg
ewotICAgICAgICAgICAgZm9yIChSZW5kZXJCb3gqIGNoaWxkID0gZmlyc3RDaGlsZEJveCgpOyBj
aGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmdCb3goKSkgewotICAgICAgICAgICAgICAg
IHNpemVfdCBjZWxsSW5kZXggPSByZXNvbHZlR3JpZFBvc2l0aW9uKChkaXJlY3Rpb24gPT0gRm9y
Q29sdW1ucykgPyBjaGlsZC0+c3R5bGUoKS0+Z3JpZEl0ZW1Db2x1bW4oKSA6IGNoaWxkLT5zdHls
ZSgpLT5ncmlkSXRlbVJvdygpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2VsbEluZGV4ICE9IGkp
Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgTGF5b3V0
VW5pdCBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlID0gbWF4Q29udGVudEZvckNoaWxkKGNoaWxkLCBk
aXJlY3Rpb24sIGNvbHVtblRyYWNrcykgLSB0cmFjay5tYXhCcmVhZHRoSWZOb3RJbmZpbml0ZSgp
OwotICAgICAgICAgICAgICAgIExheW91dFVuaXQgc2hhcmUgPSBzdGQ6Om1pbihhZGRpdGlvbmFs
QnJlYWR0aFNwYWNlLCB0cmFja3NbaV0ubV9tYXhCcmVhZHRoIC0gdHJhY2subWF4QnJlYWR0aElm
Tm90SW5maW5pdGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLm1fbWF4QnJlYWR0aCA9
PSBpbmZpbml0eSkKLSAgICAgICAgICAgICAgICAgICAgdHJhY2subV9tYXhCcmVhZHRoID0gdHJh
Y2subV91c2VkQnJlYWR0aCArIHNoYXJlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgdHJhY2subV9tYXhCcmVhZHRoICs9IHNoYXJlOwotICAgICAgICAgICAgfQot
ICAgICAgICB9CisgICAgICAgIGlmIChtYXhUcmFja0JyZWFkdGguaXNNYXhDb250ZW50KCkpCisg
ICAgICAgICAgICByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVt
czxNYXhCcmVhZHRoQWNjdW11bGF0b3IsIE1heENvbnRlbnRGdW5jdGlvbj4oZGlyZWN0aW9uLCBj
b2x1bW5UcmFja3MsIHJvd1RyYWNrcywgaSwgYXZhaWxhYmxlTG9naWNhbFNwYWNlKTsKICAgICB9
CiAKICAgICAvLyBGSVhNRTogVGhlIHNwZWMgc2F5cyB0byB1cGRhdGUgbWF4QnJlYWR0aCBpZiBp
dCBpcyBJbmZpbml0eS4KIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgQWNjdW11bGF0b3IsIFJlbmRl
ckdyaWQ6OlNpemluZ0Z1bmN0aW9uIGZ1bmN0aW9uPgordm9pZCBSZW5kZXJHcmlkOjpyZXNvbHZl
Q29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyhUcmFja1NpemluZ0RpcmVj
dGlvbiBkaXJlY3Rpb24sIFZlY3RvcjxHcmlkVHJhY2s+JiBjb2x1bW5UcmFja3MsIFZlY3RvcjxH
cmlkVHJhY2s+JiByb3dUcmFja3MsIHNpemVfdCBpLCBMYXlvdXRVbml0JiBhdmFpbGFibGVMb2dp
Y2FsU3BhY2UpCit7CisgICAgLy8gRklYTUU6IFRoZSBzcGVjaWZpY2F0aW9uIHJlLXVzZXMgZGlz
dHJpYnV0ZVNwYWNlVG9UcmFjaywgd2hpY2ggd2Ugc2hvdWxkIHByb2JhYmx5IGRvLgorICAgIEdy
aWRUcmFjayYgdHJhY2sgPSAoZGlyZWN0aW9uID09IEZvckNvbHVtbnMpID8gY29sdW1uVHJhY2tz
W2ldIDogcm93VHJhY2tzW2ldOworICAgIGZvciAoUmVuZGVyQm94KiBjaGlsZCA9IGZpcnN0Q2hp
bGRCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCkpIHsKKyAgICAg
ICAgc2l6ZV90IGNlbGxJbmRleCA9IHJlc29sdmVHcmlkUG9zaXRpb24oZGlyZWN0aW9uLCBjaGls
ZCk7CisgICAgICAgIGlmIChjZWxsSW5kZXggIT0gaSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIExheW91dFVuaXQgY29udGVudFNpemUgPSBmdW5jdGlvbiA9PSBNaW5Db250ZW50
RnVuY3Rpb24gPyBtaW5Db250ZW50Rm9yQ2hpbGQoY2hpbGQsIGRpcmVjdGlvbiwgY29sdW1uVHJh
Y2tzKSA6IG1heENvbnRlbnRGb3JDaGlsZChjaGlsZCwgZGlyZWN0aW9uLCBjb2x1bW5UcmFja3Mp
OworICAgICAgICBMYXlvdXRVbml0IGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UgPSBjb250ZW50U2l6
ZSAtIEFjY3VtdWxhdG9yOjp2YWx1ZSh0cmFjayk7CisgICAgICAgIExheW91dFVuaXQgc2hhcmUg
PSBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlOworICAgICAgICBzdGQ6Om1pbihhZGRpdGlvbmFsQnJl
YWR0aFNwYWNlLCB0cmFjay5tX21heEJyZWFkdGggLSBBY2N1bXVsYXRvcjo6dmFsdWUodHJhY2sp
KTsKKyAgICAgICAgQWNjdW11bGF0b3I6Omdyb3codHJhY2ssIHNoYXJlKTsKKyAgICAgICAgaWYg
KEFjY3VtdWxhdG9yOjpzaG91bGRVcGRhdGVBdmFpbGFibGVMb2dpY2FsU3BhY2UoKSkKKyAgICAg
ICAgICAgIGF2YWlsYWJsZUxvZ2ljYWxTcGFjZSAtPSBzaGFyZTsKKyAgICB9Cit9CisKIHZvaWQg
UmVuZGVyR3JpZDo6ZGlzdHJpYnV0ZVNwYWNlVG9UcmFja3MoVHJhY2tTaXppbmdEaXJlY3Rpb24s
IFZlY3RvcjxHcmlkVHJhY2s+JiB0cmFja3MsIExheW91dFVuaXQgYXZhaWxhYmxlTG9naWNhbFNw
YWNlKQogewogICAgIGNvbnN0IHNpemVfdCB0cmFja3NTaXplID0gdHJhY2tzLnNpemUoKTsKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmggYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyR3JpZC5oCmluZGV4IGQ1MDhhZTBjMGRkY2NlM2FkOWUy
MDAyMGUxYzQxZWRjNDlkMjA1OTMuLjRkZGNiYWE3NmQ2NDk4NjdjMmU0NWQ3NDNkM2FiYTE0Mzc1
MDdlZjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQuaApAQCAtMzAsNiArMzAs
NyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIEFjY3VtdWxhdG9yOwogY2xhc3Mg
R3JpZFRyYWNrOwogCiBjbGFzcyBSZW5kZXJHcmlkIDogcHVibGljIFJlbmRlckJsb2NrIHsKQEAg
LTU0LDYgKzU1LDEyIEBAIHByaXZhdGU6CiAgICAgTGF5b3V0VW5pdCBjb21wdXRlVXNlZEJyZWFk
dGhPZk1heExlbmd0aChUcmFja1NpemluZ0RpcmVjdGlvbiwgY29uc3QgTGVuZ3RoJikgY29uc3Q7
CiAgICAgTGF5b3V0VW5pdCBjb21wdXRlVXNlZEJyZWFkdGhPZlNwZWNpZmllZExlbmd0aChUcmFj
a1NpemluZ0RpcmVjdGlvbiwgY29uc3QgTGVuZ3RoJikgY29uc3Q7CiAgICAgdm9pZCByZXNvbHZl
Q29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnMoVHJhY2tTaXppbmdEaXJlY3Rpb24sIFZl
Y3RvcjxHcmlkVHJhY2s+JiBjb2x1bW5UcmFja3MsIFZlY3RvcjxHcmlkVHJhY2s+JiByb3dUcmFj
a3MsIExheW91dFVuaXQmIGF2YWlsYWJsZUxvZ2ljYWxTcGFjZSk7CisgICAgZW51bSBTaXppbmdG
dW5jdGlvbiB7CisgICAgICAgIE1pbkNvbnRlbnRGdW5jdGlvbiwKKyAgICAgICAgTWF4Q29udGVu
dEZ1bmN0aW9uCisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBY2N1bXVsYXRvciwgU2l6
aW5nRnVuY3Rpb24+CisgICAgdm9pZCByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5j
dGlvbnNGb3JJdGVtcyhUcmFja1NpemluZ0RpcmVjdGlvbiwgVmVjdG9yPEdyaWRUcmFjaz4mIGNv
bHVtblRyYWNrcywgVmVjdG9yPEdyaWRUcmFjaz4mIHJvd1RyYWNrcywgc2l6ZV90LCBMYXlvdXRV
bml0JiBhdmFpbGFibGVMb2dpY2FsU3BhY2UpOwogICAgIHZvaWQgZGlzdHJpYnV0ZVNwYWNlVG9U
cmFja3MoVHJhY2tTaXppbmdEaXJlY3Rpb24sIFZlY3RvcjxHcmlkVHJhY2s+JiwgTGF5b3V0VW5p
dCBhdmFpbGFibGVMb2dpY2FsU3BhY2UpOwogICAgIHZvaWQgbGF5b3V0R3JpZEl0ZW1zKCk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>184813</attachid>
            <date>2013-01-25 14:55:37 -0800</date>
            <delta_ts>2013-01-25 17:53:41 -0800</delta_ts>
            <desc>Proposed change v2: Use function pointers instead.</desc>
            <filename>bug-107740-20130125145227.patch</filename>
            <type>text/plain</type>
            <size>9915</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQwODQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZmQ5ZTIxNGI0Yzg2ODY1
ZWFlYWI5NmZiNjM2YmMwZmIzZGU5NTYzOC4uMDQ3NzcxY2JiZDQ4ZDNiMTU5MmY0OGE2YmQ3OGZh
NWFjZDFhNTRmYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMzIEBACisyMDEzLTAxLTI1ICBKdWxp
ZW4gQ2hhZmZyYWl4ICA8amNoYWZmcmFpeEB3ZWJraXQub3JnPgorCisgICAgICAgIFNoYXJlIGNv
ZGUgYmV0d2VlbiB0aGUgZGlmZmVyZW50IG1pbi1jb250ZW50IC8gbWF4LWNvbnRlbnQgY29kZSBw
YXRocworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA3
NzQwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhp
cyBjaGFuZ2UgZW5hYmxlcyBzaGFyaW5nIGJldHdlZW4gdGhlIGRpZmZlcmVudCBjb250ZW50IGJh
c2VkIGNvbXB1dGF0aW9ucworICAgICAgICBieSB1c2luZyBmdW5jdGlvbiBwb2ludGVycyB0byBz
cGVjaWFsaXplIHRoZSBiZWhhdmlvciBhcyBuZWVkZWQuCisKKyAgICAgICAgUmVmYWN0b3Jpbmcs
IGNvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMuCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVy
R3JpZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmlkVHJhY2s6Omdyb3dVc2VkQnJlYWR0aCk6
CisgICAgICAgIChXZWJDb3JlOjpHcmlkVHJhY2s6OnVzZWRCcmVhZHRoKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyaWRUcmFjazo6Z3Jvd01heEJyZWFkdGgpOgorICAgICAgICBBZGRlZCB0aGUgcHJl
dmlvdXMgZ2V0dGVycyAvIHNldHRlcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byByZXNvbHZlQ29u
dGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcy4KKworICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zKToK
KyAgICAgICAgVXBkYXRlZCB0byByZXVzZSByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdG
dW5jdGlvbnNGb3JJdGVtcyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGNvZGUuCisgICAgICAgIE9u
ZSBjaGFuZ2UgaXMgdGhhdCBub3csIHdlIHByb3Blcmx5IGFwcGx5IHRoZSBtaW4gb24gYWxsIGJy
YW5jaGVzLCB3aGljaCB3YXMgYW4gb3ZlcnNpZ2h0IG9mCisgICAgICAgIHRoZSBwcmV2aW91cyBw
YXRjaGVzLgorCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJHcmlkOjpyZXNvbHZlQ29udGVudEJh
c2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyk6CisgICAgICAgIEFkZGVkIHRoaXMgZnVu
Y3Rpb24gYXMgdGhlIGNvcmUgY29udGVudC1zaXplZCByZXNvbHV0aW9uIGZ1bmN0aW9uLiBGb3Ig
bm93LCB3ZSBwYXNzIHRoZQorICAgICAgICBjdXJyZW50IHRyYWNrIGJ5IGRpcmVjdGlvbiAmIGlu
ZGV4IHRvIGJlIGFibGUgdG8gZmlsdGVyIGdyaWQgaXRlbXMuCisKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyR3JpZC5oOgorICAgICAgICBBZGRlZCByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tT
aXppbmdGdW5jdGlvbnNGb3JJdGVtcyBhbmQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHR5cGVkZWYn
cy4KKwogMjAxMy0wMS0yNSAgQWJoaXNoZWsgQXJ5YSAgPGluZmVybm9AY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJlZ3Jlc3Npb24ocjEzOTgzNik6IENyYXNoIGluIFdURjo6ZXF1YWxJZ25vcmlu
Z0Nhc2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmNwcAppbmRleCBlZDc2NzBl
YTA0ZTA4NGZlODBhZGQ0ZmY4Y2FlZmFjYTI1ZWM1MjMxLi4yMzA3MjM0Y2UxMzUwOWNlZDM4NjJl
MDI1MDI5ZDBlZmVhN2Y0NDg5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyR3JpZC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQu
Y3BwCkBAIC00Myw2ICs0MywyMCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAorICAgIHZvaWQg
Z3Jvd1VzZWRCcmVhZHRoKExheW91dFVuaXQgZ3Jvd3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGdyb3d0aCA+PSAwKTsKKyAgICAgICAgbV91c2VkQnJlYWR0aCArPSBncm93dGg7CisgICAgfQor
ICAgIExheW91dFVuaXQgdXNlZEJyZWFkdGgoKSBjb25zdCB7IHJldHVybiBtX3VzZWRCcmVhZHRo
OyB9CisKKyAgICB2b2lkIGdyb3dNYXhCcmVhZHRoKExheW91dFVuaXQgZ3Jvd3RoKQorICAgIHsK
KyAgICAgICAgaWYgKG1fbWF4QnJlYWR0aCA9PSBpbmZpbml0eSkKKyAgICAgICAgICAgIG1fbWF4
QnJlYWR0aCA9IG1fdXNlZEJyZWFkdGggKyBncm93dGg7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG1fbWF4QnJlYWR0aCArPSBncm93dGg7CisgICAgfQogICAgIExheW91dFVuaXQgbWF4QnJl
YWR0aElmTm90SW5maW5pdGUoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIChtX21heEJy
ZWFkdGggPT0gaW5maW5pdHkpID8gbV91c2VkQnJlYWR0aCA6IG1fbWF4QnJlYWR0aDsKQEAgLTI3
Miw2NyArMjg2LDQ1IEBAIHZvaWQgUmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNr
U2l6aW5nRnVuY3Rpb25zKFRyYWNrU2l6aW5nRGlyZWN0aW9uIGRpCiAgICAgICAgIEdyaWRUcmFj
ayYgdHJhY2sgPSB0cmFja3NbaV07CiAgICAgICAgIGNvbnN0IExlbmd0aCYgbWluVHJhY2tCcmVh
ZHRoID0gdHJhY2tTdHlsZXNbaV0ubWluVHJhY2tCcmVhZHRoKCk7CiAgICAgICAgIGlmIChtaW5U
cmFja0JyZWFkdGguaXNNaW5Db250ZW50KCkgfHwgbWluVHJhY2tCcmVhZHRoLmlzTWF4Q29udGVu
dCgpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogVGhlIHNwZWNpZmljYXRpb24gZmFjdG9ycyB0
aGlzIGxvZ2ljIGludG8gcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9y
SXRlbXMKLSAgICAgICAgICAgIC8vIHRvIHJldXNlIGNvZGUgYmV0d2VlbiB0aGUgYnJhbmNoZXMg
YW5kIGFsc28gY2FsbHMgZGlzdHJpYnV0ZVNwYWNlVG9UcmFja3MuCi0gICAgICAgICAgICBmb3Ig
KFJlbmRlckJveCogY2hpbGQgPSBmaXJzdENoaWxkQm94KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZ0JveCgpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNlbGxJbmRleCA9
IHJlc29sdmVHcmlkUG9zaXRpb24oZGlyZWN0aW9uLCBjaGlsZCk7Ci0gICAgICAgICAgICAgICAg
aWYgKGNlbGxJbmRleCAhPSBpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAgICAgICAgIExheW91dFVuaXQgYWRkaXRpb25hbEJyZWFkdGhTcGFjZSA9IG1pbkNvbnRl
bnRGb3JDaGlsZChjaGlsZCwgZGlyZWN0aW9uLCBjb2x1bW5UcmFja3MpIC0gdHJhY2subV91c2Vk
QnJlYWR0aDsKLSAgICAgICAgICAgICAgICBBU1NFUlQoYWRkaXRpb25hbEJyZWFkdGhTcGFjZSA+
PSAwKTsKLSAgICAgICAgICAgICAgICB0cmFjay5tX3VzZWRCcmVhZHRoICs9IGFkZGl0aW9uYWxC
cmVhZHRoU3BhY2U7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNhbFNwYWNlIC09IGFk
ZGl0aW9uYWxCcmVhZHRoU3BhY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBMYXlvdXRV
bml0IG9sZFVzZWRCcmVhZHRoID0gdHJhY2subV91c2VkQnJlYWR0aDsKKyAgICAgICAgICAgIHJl
c29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9uc0Zvckl0ZW1zKGRpcmVjdGlvbiwg
Y29sdW1uVHJhY2tzLCByb3dUcmFja3MsIGksICZSZW5kZXJHcmlkOjptaW5Db250ZW50Rm9yQ2hp
bGQsICZHcmlkVHJhY2s6OnVzZWRCcmVhZHRoLCAmR3JpZFRyYWNrOjpncm93VXNlZEJyZWFkdGgp
OworICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNhbFNwYWNlIC09ICh0cmFjay5tX3VzZWRCcmVh
ZHRoIC0gb2xkVXNlZEJyZWFkdGgpOwogICAgICAgICB9CisKICAgICAgICAgaWYgKG1pblRyYWNr
QnJlYWR0aC5pc01heENvbnRlbnQoKSkgewotICAgICAgICAgICAgZm9yIChSZW5kZXJCb3gqIGNo
aWxkID0gZmlyc3RDaGlsZEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmdC
b3goKSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBjZWxsSW5kZXggPSByZXNvbHZlR3JpZFBv
c2l0aW9uKChkaXJlY3Rpb24gPT0gRm9yQ29sdW1ucykgPyBjaGlsZC0+c3R5bGUoKS0+Z3JpZEl0
ZW1Db2x1bW4oKSA6IGNoaWxkLT5zdHlsZSgpLT5ncmlkSXRlbVJvdygpKTsKLSAgICAgICAgICAg
ICAgICBpZiAoY2VsbEluZGV4ICE9IGkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlID0gbWF4
Q29udGVudEZvckNoaWxkKGNoaWxkLCBkaXJlY3Rpb24sIGNvbHVtblRyYWNrcykgLSB0cmFjay5t
X3VzZWRCcmVhZHRoOwotICAgICAgICAgICAgICAgIEFTU0VSVChhZGRpdGlvbmFsQnJlYWR0aFNw
YWNlID49IDApOwotICAgICAgICAgICAgICAgIHRyYWNrLm1fdXNlZEJyZWFkdGggKz0gYWRkaXRp
b25hbEJyZWFkdGhTcGFjZTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsU3BhY2Ug
LT0gYWRkaXRpb25hbEJyZWFkdGhTcGFjZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExh
eW91dFVuaXQgb2xkVXNlZEJyZWFkdGggPSB0cmFjay5tX3VzZWRCcmVhZHRoOworICAgICAgICAg
ICAgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXMoZGlyZWN0
aW9uLCBjb2x1bW5UcmFja3MsIHJvd1RyYWNrcywgaSwgJlJlbmRlckdyaWQ6Om1heENvbnRlbnRG
b3JDaGlsZCwgJkdyaWRUcmFjazo6dXNlZEJyZWFkdGgsICZHcmlkVHJhY2s6Omdyb3dVc2VkQnJl
YWR0aCk7CisgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsU3BhY2UgLT0gKHRyYWNrLm1fdXNl
ZEJyZWFkdGggLSBvbGRVc2VkQnJlYWR0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBM
ZW5ndGgmIG1heFRyYWNrQnJlYWR0aCA9IHRyYWNrU3R5bGVzW2ldLm1heFRyYWNrQnJlYWR0aCgp
OwotICAgICAgICBpZiAobWF4VHJhY2tCcmVhZHRoLmlzTWluQ29udGVudCgpIHx8IG1heFRyYWNr
QnJlYWR0aC5pc01heENvbnRlbnQoKSkgewotICAgICAgICAgICAgZm9yIChSZW5kZXJCb3gqIGNo
aWxkID0gZmlyc3RDaGlsZEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmdC
b3goKSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBjZWxsSW5kZXggPSByZXNvbHZlR3JpZFBv
c2l0aW9uKGRpcmVjdGlvbiwgY2hpbGQpOwotICAgICAgICAgICAgICAgIGlmIChjZWxsSW5kZXgg
IT0gaSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBM
YXlvdXRVbml0IGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UgPSBtaW5Db250ZW50Rm9yQ2hpbGQoY2hp
bGQsIGRpcmVjdGlvbiwgY29sdW1uVHJhY2tzKSAtIHRyYWNrLm1heEJyZWFkdGhJZk5vdEluZmlu
aXRlKCk7Ci0gICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBzaGFyZSA9IHN0ZDo6bWluKGFkZGl0
aW9uYWxCcmVhZHRoU3BhY2UsIHRyYWNrc1tpXS5tX21heEJyZWFkdGggLSB0cmFjay5tYXhCcmVh
ZHRoSWZOb3RJbmZpbml0ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2subV9tYXhCcmVh
ZHRoID09IGluZmluaXR5KQotICAgICAgICAgICAgICAgICAgICB0cmFjay5tX21heEJyZWFkdGgg
PSB0cmFjay5tX3VzZWRCcmVhZHRoICsgc2hhcmU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgICAgICB0cmFjay5tX21heEJyZWFkdGggKz0gc2hhcmU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKG1heFRyYWNrQnJlYWR0aC5pc01pbkNvbnRlbnQo
KSB8fCBtYXhUcmFja0JyZWFkdGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXNvbHZl
Q29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyhkaXJlY3Rpb24sIGNvbHVt
blRyYWNrcywgcm93VHJhY2tzLCBpLCAmUmVuZGVyR3JpZDo6bWluQ29udGVudEZvckNoaWxkLCAm
R3JpZFRyYWNrOjptYXhCcmVhZHRoSWZOb3RJbmZpbml0ZSwgJkdyaWRUcmFjazo6Z3Jvd01heEJy
ZWFkdGgpOwogCi0gICAgICAgIGlmIChtYXhUcmFja0JyZWFkdGguaXNNYXhDb250ZW50KCkpIHsK
LSAgICAgICAgICAgIGZvciAoUmVuZGVyQm94KiBjaGlsZCA9IGZpcnN0Q2hpbGRCb3goKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCkpIHsKLSAgICAgICAgICAgICAgICBz
aXplX3QgY2VsbEluZGV4ID0gcmVzb2x2ZUdyaWRQb3NpdGlvbigoZGlyZWN0aW9uID09IEZvckNv
bHVtbnMpID8gY2hpbGQtPnN0eWxlKCktPmdyaWRJdGVtQ29sdW1uKCkgOiBjaGlsZC0+c3R5bGUo
KS0+Z3JpZEl0ZW1Sb3coKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNlbGxJbmRleCAhPSBpKQot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIExheW91dFVu
aXQgYWRkaXRpb25hbEJyZWFkdGhTcGFjZSA9IG1heENvbnRlbnRGb3JDaGlsZChjaGlsZCwgZGly
ZWN0aW9uLCBjb2x1bW5UcmFja3MpIC0gdHJhY2subWF4QnJlYWR0aElmTm90SW5maW5pdGUoKTsK
LSAgICAgICAgICAgICAgICBMYXlvdXRVbml0IHNoYXJlID0gc3RkOjptaW4oYWRkaXRpb25hbEJy
ZWFkdGhTcGFjZSwgdHJhY2tzW2ldLm1fbWF4QnJlYWR0aCAtIHRyYWNrLm1heEJyZWFkdGhJZk5v
dEluZmluaXRlKCkpOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay5tX21heEJyZWFkdGggPT0g
aW5maW5pdHkpCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLm1fbWF4QnJlYWR0aCA9IHRyYWNr
Lm1fdXNlZEJyZWFkdGggKyBzaGFyZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIHRyYWNrLm1fbWF4QnJlYWR0aCArPSBzaGFyZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQorICAgICAgICBpZiAobWF4VHJhY2tCcmVhZHRoLmlzTWF4Q29udGVudCgpKQorICAg
ICAgICAgICAgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXMo
ZGlyZWN0aW9uLCBjb2x1bW5UcmFja3MsIHJvd1RyYWNrcywgaSwgJlJlbmRlckdyaWQ6Om1heENv
bnRlbnRGb3JDaGlsZCwgJkdyaWRUcmFjazo6bWF4QnJlYWR0aElmTm90SW5maW5pdGUsICZHcmlk
VHJhY2s6Omdyb3dNYXhCcmVhZHRoKTsKICAgICB9CiAKICAgICAvLyBGSVhNRTogVGhlIHNwZWMg
c2F5cyB0byB1cGRhdGUgbWF4QnJlYWR0aCBpZiBpdCBpcyBJbmZpbml0eS4KIH0KIAordm9pZCBS
ZW5kZXJHcmlkOjpyZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVt
cyhUcmFja1NpemluZ0RpcmVjdGlvbiBkaXJlY3Rpb24sIFZlY3RvcjxHcmlkVHJhY2s+JiBjb2x1
bW5UcmFja3MsIFZlY3RvcjxHcmlkVHJhY2s+JiByb3dUcmFja3MsIHNpemVfdCBpLCBTaXppbmdG
dW5jdGlvbiBzaXppbmdGdW5jdGlvbiwgQWNjdW11bGF0b3JHZXR0ZXIgdHJhY2tHZXR0ZXIsIEFj
Y3VtdWxhdG9yR3Jvd0Z1bmN0aW9uIHRyYWNrR3Jvd3RoRnVuY3Rpb24pCit7CisgICAgLy8gRklY
TUU6IFRoZSBzcGVjaWZpY2F0aW9uIHJlLXVzZXMgZGlzdHJpYnV0ZVNwYWNlVG9UcmFjaywgd2hp
Y2ggd2Ugc2hvdWxkIHByb2JhYmx5IGRvLgorICAgIEdyaWRUcmFjayYgdHJhY2sgPSAoZGlyZWN0
aW9uID09IEZvckNvbHVtbnMpID8gY29sdW1uVHJhY2tzW2ldIDogcm93VHJhY2tzW2ldOworICAg
IGZvciAoUmVuZGVyQm94KiBjaGlsZCA9IGZpcnN0Q2hpbGRCb3goKTsgY2hpbGQ7IGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nQm94KCkpIHsKKyAgICAgICAgc2l6ZV90IGNlbGxJbmRleCA9IHJl
c29sdmVHcmlkUG9zaXRpb24oZGlyZWN0aW9uLCBjaGlsZCk7CisgICAgICAgIGlmIChjZWxsSW5k
ZXggIT0gaSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIExheW91dFVuaXQgY29u
dGVudFNpemUgPSAodGhpcy0+KnNpemluZ0Z1bmN0aW9uKShjaGlsZCwgZGlyZWN0aW9uLCBjb2x1
bW5UcmFja3MpOworICAgICAgICBMYXlvdXRVbml0IGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UgPSBj
b250ZW50U2l6ZSAtICh0cmFjay4qdHJhY2tHZXR0ZXIpKCk7CisgICAgICAgIExheW91dFVuaXQg
c2hhcmUgPSBhZGRpdGlvbmFsQnJlYWR0aFNwYWNlOworICAgICAgICBzdGQ6Om1pbihhZGRpdGlv
bmFsQnJlYWR0aFNwYWNlLCB0cmFjay5tX21heEJyZWFkdGggLSAodHJhY2suKnRyYWNrR2V0dGVy
KSgpKTsKKyAgICAgICAgKHRyYWNrLip0cmFja0dyb3d0aEZ1bmN0aW9uKShzaGFyZSk7CisgICAg
fQorfQorCiB2b2lkIFJlbmRlckdyaWQ6OmRpc3RyaWJ1dGVTcGFjZVRvVHJhY2tzKFRyYWNrU2l6
aW5nRGlyZWN0aW9uLCBWZWN0b3I8R3JpZFRyYWNrPiYgdHJhY2tzLCBMYXlvdXRVbml0IGF2YWls
YWJsZUxvZ2ljYWxTcGFjZSkKIHsKICAgICBjb25zdCBzaXplX3QgdHJhY2tzU2l6ZSA9IHRyYWNr
cy5zaXplKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyR3Jp
ZC5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQuaAppbmRleCBkNTA4YWUw
YzBkZGNjZTNhZDllMjAwMjBlMWM0MWVkYzQ5ZDIwNTkzLi40OTMzYjUzMjhiMjExZTA0NmM0ZDM4
NzgyN2E2M2YwOTkwNzE2NDkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyR3JpZC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmgK
QEAgLTU3LDYgKzU3LDExIEBAIHByaXZhdGU6CiAgICAgdm9pZCBkaXN0cmlidXRlU3BhY2VUb1Ry
YWNrcyhUcmFja1NpemluZ0RpcmVjdGlvbiwgVmVjdG9yPEdyaWRUcmFjaz4mLCBMYXlvdXRVbml0
IGF2YWlsYWJsZUxvZ2ljYWxTcGFjZSk7CiAgICAgdm9pZCBsYXlvdXRHcmlkSXRlbXMoKTsKIAor
ICAgIHR5cGVkZWYgTGF5b3V0VW5pdCAoUmVuZGVyR3JpZDo6KiBTaXppbmdGdW5jdGlvbikoUmVu
ZGVyQm94KiwgVHJhY2tTaXppbmdEaXJlY3Rpb24sIFZlY3RvcjxHcmlkVHJhY2s+Jik7CisgICAg
dHlwZWRlZiBMYXlvdXRVbml0IChHcmlkVHJhY2s6OiogQWNjdW11bGF0b3JHZXR0ZXIpKCkgY29u
c3Q7CisgICAgdHlwZWRlZiB2b2lkIChHcmlkVHJhY2s6OiogQWNjdW11bGF0b3JHcm93RnVuY3Rp
b24pKExheW91dFVuaXQpOworICAgIHZvaWQgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5n
RnVuY3Rpb25zRm9ySXRlbXMoVHJhY2tTaXppbmdEaXJlY3Rpb24sIFZlY3RvcjxHcmlkVHJhY2s+
JiBjb2x1bW5UcmFja3MsIFZlY3RvcjxHcmlkVHJhY2s+JiByb3dUcmFja3MsIHNpemVfdCwgU2l6
aW5nRnVuY3Rpb24sIEFjY3VtdWxhdG9yR2V0dGVyLCBBY2N1bXVsYXRvckdyb3dGdW5jdGlvbik7
CisKICAgICBMYXlvdXRVbml0IG1pbkNvbnRlbnRGb3JDaGlsZChSZW5kZXJCb3gqLCBUcmFja1Np
emluZ0RpcmVjdGlvbiwgVmVjdG9yPEdyaWRUcmFjaz4mIGNvbHVtblRyYWNrcyk7CiAgICAgTGF5
b3V0VW5pdCBtYXhDb250ZW50Rm9yQ2hpbGQoUmVuZGVyQm94KiwgVHJhY2tTaXppbmdEaXJlY3Rp
b24sIFZlY3RvcjxHcmlkVHJhY2s+JiBjb2x1bW5UcmFja3MpOwogICAgIExheW91dFBvaW50IGZp
bmRDaGlsZExvZ2ljYWxQb3NpdGlvbihSZW5kZXJCb3gqLCBjb25zdCBWZWN0b3I8R3JpZFRyYWNr
PiYgY29sdW1uVHJhY2tzLCBjb25zdCBWZWN0b3I8R3JpZFRyYWNrPiYgcm93VHJhY2tzKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>