<?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>52866</bug_id>
          
          <creation_ts>2011-01-20 20:58:23 -0800</creation_ts>
          <short_desc>Store draft comments in localStorage</short_desc>
          <delta_ts>2011-02-01 16:03:15 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ojan Vafai">ojan</reporter>
          <assigned_to name="Ojan Vafai">ojan</assigned_to>
          <cc>abarth</cc>
    
    <cc>aroben</cc>
    
    <cc>eric</cc>
    
    <cc>mihaip</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>337851</commentid>
    <comment_count>0</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-20 20:58:23 -0800</bug_when>
    <thetext>Store draft comments in localStorage</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337854</commentid>
    <comment_count>1</comment_count>
      <attachid>79689</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-20 20:59:03 -0800</bug_when>
    <thetext>Created attachment 79689
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337862</commentid>
    <comment_count>2</comment_count>
      <attachid>79689</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-20 21:27:22 -0800</bug_when>
    <thetext>Comment on attachment 79689
Patch

You&apos;re blowing my mind!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337868</commentid>
    <comment_count>3</comment_count>
      <attachid>79689</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-01-20 21:52:24 -0800</bug_when>
    <thetext>Comment on attachment 79689
Patch

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

I&apos;d put a &quot;born-on&quot; date in the draft comment JSON so we can GC draft comments that are older than, say, a month.  Would be nice to see one more iteration.

&gt; Websites/bugs.webkit.org/code-review.js:154
&gt; +    $(JSON.parse(serialized_comments)).each(function() {
&gt; +      addDraftComment(this.start_line_id, this.end_line_id, this.contents);
&gt; +    });

We need some better error handling here in case localStorage gets corrupted somehow.

&gt; Websites/bugs.webkit.org/code-review.js:171
&gt; +    localStorage.setItem(&apos;draft-comments-for-attachment-&apos; + attachment_id, JSON.stringify(comment_store));

Do we need to handle the case where we&apos;re out of storage space?  Maybe catch whatever exception that is and offer to clear previous draft comments?

&gt; Websites/bugs.webkit.org/code-review.js:1099
&gt; -  $(&apos;.comment .discard&apos;).live(&apos;click&apos;, discardComment);
&gt; +  $(&apos;.comment .discard&apos;).live(&apos;click&apos;, function() { discardComment($(this).parents(&apos;.comment&apos;)); });

Maybe make this function into handleDiscardCommentClick?  Seems prettier to just bind a function with a name in case it grows later.

&gt; Websites/bugs.webkit.org/code-review.js:1105
&gt; -      discardComment.call(this);
&gt; +      discardComment.call(comment_block);

Did you test this part?  We don&apos;t want call here, which will bind comment_block to |this| in discardComment.  We just want to call the function normally.

&gt; Websites/bugs.webkit.org/code-review.js:1115
&gt; +  $(&apos;.comment .ok&apos;).live(&apos;click&apos;, function() {
&gt; +    freezeComment($(this).parents(&apos;.comment&apos;));
&gt; +    saveDraftComments();

Maybe you&apos;re right that we can use this anonymous functions.  I&apos;d move &quot;discard&quot; and &quot;ok&quot; to be next to each other though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338487</commentid>
    <comment_count>4</comment_count>
      <attachid>79821</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-21 20:14:10 -0800</bug_when>
    <thetext>Created attachment 79821
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338488</commentid>
    <comment_count>5</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-21 20:15:04 -0800</bug_when>
    <thetext>Addressed all comments. Also, made this comment saving into a standalone class so that I could more easily unittest it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340039</commentid>
    <comment_count>6</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-25 17:27:51 -0800</bug_when>
    <thetext>ping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340126</commentid>
    <comment_count>7</comment_count>
      <attachid>79821</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-01-25 21:09:56 -0800</bug_when>
    <thetext>Comment on attachment 79821
Patch

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

I&apos;m very excited about the tests in this patch.  Some minor style / organizational nits below.

&gt; Websites/bugs.webkit.org/code-review-test.html:2
&gt; +&lt;div&gt;Tests for some of the easily unittestable parts of code-review.js. You should see a series of &quot;PASSED&quot; lines.&lt;/div&gt;
&gt; +&lt;div&gt;FIXME: Run these as part of the layout test suite?&lt;/div&gt;

Crazy!  I&apos;m not sure if this is the ideal location for this file, but I&apos;m not sure what&apos;s better.

&gt; Websites/bugs.webkit.org/code-review-test.html:92
&gt; +ASSERT_EQUAL(ls.json(), &apos;QuotaExceeded on setItem:draft-comments-for-attachment-1234,{MOCK JSON}\ngetItem:draft-comments-for-attachment-1\ngetItem:draft-comments-for-attachment-2\ngetItem:draft-comments-for-attachment-3\ngetItem:draft-comments-for-attachment-4\nremoveItem:draft-comments-for-attachment-1\nremoveItem:draft-comments-for-attachment-2\nremoveItem:draft-comments-for-attachment-3\nsetItem:draft-comments-for-attachment-1234,{MOCK JSON}&apos;);

This would be prettier in python.

&gt; Websites/bugs.webkit.org/code-review.js:72
&gt; +  var g_displayedDraftComments = false;

Should we add g_ to the other global variables?  Also, we&apos;ve been using unix_hacker for variable names.

&gt; Websites/bugs.webkit.org/code-review.js:156
&gt; +    g_displayedDraftComments = true;
&gt; +    var serialized_comments = localStorage.getItem(DraftCommentSaver._keyPrefix + attachment_id);
&gt; +    if (!serialized_comments)
&gt; +      return;

Shouldn&apos;t the DraftCommentSaver do this work?

&gt; Websites/bugs.webkit.org/code-review.js:186
&gt; +  // Export this so we can unittest it.
&gt; +  window[&apos;DraftCommentSaver&apos;] = DraftCommentSaver;

Can we make this conditional on being in the unit test?

&gt; Websites/bugs.webkit.org/code-review.js:227
&gt; +    var bool = this._prompt(&apos;Local storage quota is full. Remove draft comments from all reviews to make room?&apos;);
&gt; +    if (!bool) {

bool is kind of a lame variable name.  remove_comments?

&gt; Websites/bugs.webkit.org/code-review.js:228
&gt; +      this._saveComments = false;

We don&apos;t really have a strong style guide here, but I would have expected _unix_hacker for private member variable names.

&gt; Websites/bugs.webkit.org/code-review.js:241
&gt; +    return prompt(&apos;Local storage quota is full. Remove draft comments from all reviews to make room?&apos;);;

extra semicolon.  &quot;all previous reviews&quot; ?

&gt; Websites/bugs.webkit.org/code-review.js:270
&gt; +    var draft_comment_keys = [];

draft_comment_keys =&gt; keys_to_delete ?

&gt; Websites/bugs.webkit.org/code-review.js:273
&gt; +      if (key.indexOf(DraftCommentSaver._keyPrefix) == 0) {

Totally a style nit, but I would have reversed this condition and used a continue, mostly to conserve nesting depth.

&gt; Websites/bugs.webkit.org/code-review.js:1026
&gt; +    var old_submit = form.onsubmit;
&gt; +    form.onsubmit = function() {

This is kind of yuck.  What if there&apos;s more than one listener?  Can&apos;t we just use addEventListener and then not cancel the event?  Better yet, why not just use bind()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342983</commentid>
    <comment_count>8</comment_count>
      <attachid>79821</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-31 19:53:59 -0800</bug_when>
    <thetext>Comment on attachment 79821
Patch

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

&gt;&gt; Websites/bugs.webkit.org/code-review-test.html:2
&gt;&gt; +&lt;div&gt;FIXME: Run these as part of the layout test suite?&lt;/div&gt;
&gt; 
&gt; Crazy!  I&apos;m not sure if this is the ideal location for this file, but I&apos;m not sure what&apos;s better.

Yeah, I&apos;m not sure either. I thought about putting them in LayoutTests, but it seemed like a bad thing for a test in LayoutTests to reach out to a JS file in Websites.

&gt;&gt; Websites/bugs.webkit.org/code-review-test.html:92
&gt;&gt; +ASSERT_EQUAL(ls.json(), &apos;QuotaExceeded on setItem:draft-comments-for-attachment-1234,{MOCK JSON}\ngetItem:draft-comments-for-attachment-1\ngetItem:draft-comments-for-attachment-2\ngetItem:draft-comments-for-attachment-3\ngetItem:draft-comments-for-attachment-4\nremoveItem:draft-comments-for-attachment-1\nremoveItem:draft-comments-for-attachment-2\nremoveItem:draft-comments-for-attachment-3\nsetItem:draft-comments-for-attachment-1234,{MOCK JSON}&apos;);
&gt; 
&gt; This would be prettier in python.

It certainly would.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:72
&gt;&gt; +  var g_displayedDraftComments = false;
&gt; 
&gt; Should we add g_ to the other global variables?  Also, we&apos;ve been using unix_hacker for variable names.

I dunno. WDYT? I think it makes the code more readable. WRT unix_hacker, sorry, it&apos;s hard for me to get in the habit of that style, although we really should switch this whole file over to webkit style one day. :)

&gt;&gt; Websites/bugs.webkit.org/code-review.js:156
&gt;&gt; +      return;
&gt; 
&gt; Shouldn&apos;t the DraftCommentSaver do this work?

Hm...it probably should do some of this. I&apos;ve avoided having it touch the DOM to make it easier to unittest. But it certainly could have a parsedComments or something that gets an array of the parsed JSON. Will do.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:186
&gt;&gt; +  window[&apos;DraftCommentSaver&apos;] = DraftCommentSaver;
&gt; 
&gt; Can we make this conditional on being in the unit test?

Yes.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:227
&gt;&gt; +    if (!bool) {
&gt; 
&gt; bool is kind of a lame variable name.  remove_comments?

Heh. Sorry. Wrote that in a fit of laziness.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:270
&gt;&gt; +    var draft_comment_keys = [];
&gt; 
&gt; draft_comment_keys =&gt; keys_to_delete ?

yeah, that&apos;s def better.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:273
&gt;&gt; +      if (key.indexOf(DraftCommentSaver._keyPrefix) == 0) {
&gt; 
&gt; Totally a style nit, but I would have reversed this condition and used a continue, mostly to conserve nesting depth.

oh, good point. that&apos;s certainly more readable.

&gt;&gt; Websites/bugs.webkit.org/code-review.js:1026
&gt;&gt; +    form.onsubmit = function() {
&gt; 
&gt; This is kind of yuck.  What if there&apos;s more than one listener?  Can&apos;t we just use addEventListener and then not cancel the event?  Better yet, why not just use bind()?

There can&apos;t be more than one inline listener. But, I suppose we should be able to add a capturing event listener and make the code a bit less gross. I&apos;ll play with it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343619</commentid>
    <comment_count>9</comment_count>
      <attachid>79821</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-02-01 15:53:37 -0800</bug_when>
    <thetext>Comment on attachment 79821
Patch

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

&gt;&gt;&gt; Websites/bugs.webkit.org/code-review.js:1026
&gt;&gt;&gt; +    form.onsubmit = function() {
&gt;&gt; 
&gt;&gt; This is kind of yuck.  What if there&apos;s more than one listener?  Can&apos;t we just use addEventListener and then not cancel the event?  Better yet, why not just use bind()?
&gt; 
&gt; There can&apos;t be more than one inline listener. But, I suppose we should be able to add a capturing event listener and make the code a bit less gross. I&apos;ll play with it.

Figured out why using addEventListener didn&apos;t work before. When you submit from JS (i.e. form.submit()) it doesn&apos;t fire the submit event. Anyways, I&apos;ve changed it to use addEventListener and also do the same functionality before we call submit via JS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343629</commentid>
    <comment_count>10</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-02-01 16:03:15 -0800</bug_when>
    <thetext>Committed: http://trac.webkit.org/changeset/77330</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79689</attachid>
            <date>2011-01-20 20:59:03 -0800</date>
            <delta_ts>2011-01-21 20:14:06 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52866-20110120205902.patch</filename>
            <type>text/plain</type>
            <size>6836</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9DaGFuZ2VMb2cgYi9XZWJzaXRl
cy9idWdzLndlYmtpdC5vcmcvQ2hhbmdlTG9nCmluZGV4IDMxMjcwNTUwYjYzY2FiYjQwYTg2Zjgx
MWZiMGIyYWM3MTA3NDJkNTQuLmZhNmEwODk1ZjIzY2Y3ZWM0ZDNkM2Y0MjdiYjA1YmNhZjJjYTVi
YjIgMTAwNjQ0Ci0tLSBhL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9DaGFuZ2VMb2cKKysrIGIv
V2Vic2l0ZXMvYnVncy53ZWJraXQub3JnL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDE0IEBACiAyMDEx
LTAxLTIwICBPamFuIFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CiAKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3RvcmUgZHJhZnQgY29tbWVudHMgaW4g
bG9jYWxTdG9yYWdlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD01Mjg2NgorCisgICAgICAgICogY29kZS1yZXZpZXcuanM6CisKKzIwMTEtMDEtMjAgIE9q
YW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKwogICAgICAgICBGaXggdGhlIHJldmlldyB0
b29sIGZvciBpbWFnZSBkaWZmcy4gV2Ugd291bGQgZ2V0IGEgamF2YXNjcmlwdCBlcnJvcgogICAg
ICAgICBiZWNhdXNlIGltYWdlIGRpZmZzIGRvbid0IGhhdmUgbGluZSBudW1iZXJzLgogCmRpZmYg
LS1naXQgYS9XZWJzaXRlcy9idWdzLndlYmtpdC5vcmcvY29kZS1yZXZpZXcuanMgYi9XZWJzaXRl
cy9idWdzLndlYmtpdC5vcmcvY29kZS1yZXZpZXcuanMKaW5kZXggNzliNDk3NTU1MDg2OWFlMzlj
ZjU0YTdiNGM3OWQ2ZjdmMjE5MzM5ZS4uMzRjODk5Y2ZlZTEzYjVkZjIwODY2MTUzYjNlNTgzNDRm
MjAyYmQ5MiAxMDA2NDQKLS0tIGEvV2Vic2l0ZXMvYnVncy53ZWJraXQub3JnL2NvZGUtcmV2aWV3
LmpzCisrKyBiL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9jb2RlLXJldmlldy5qcwpAQCAtOTcs
NyArOTcsNyBAQAogICB9CiAKICAgZnVuY3Rpb24gZmlsZURpZmZGb3IobGluZSkgewotICAgIHJl
dHVybiBsaW5lLnBhcmVudHMoJy5GaWxlRGlmZicpOworICAgIHJldHVybiAkKGxpbmUpLnBhcmVu
dHMoJy5GaWxlRGlmZicpOwogICB9CiAKICAgZnVuY3Rpb24gYWN0aXZlQ29tbWVudEZvcihsaW5l
KSB7CkBAIC0xMjksNyArMTI5LDUzIEBACiAgICAgZmluZENvbW1lbnRQb3NpdGlvbkZvcihsaW5l
KS5hZnRlcihibG9jayk7CiAgIH0KIAotICBmdW5jdGlvbiBhZGRDb21tZW50Rm9yKGxpbmUpIHsK
KyAgZnVuY3Rpb24gYWRkRHJhZnRDb21tZW50KHN0YXJ0X2xpbmVfaWQsIGVuZF9saW5lX2lkLCBj
b250ZW50cykgeworICAgIHZhciBsaW5lID0gJCgnIycgKyBlbmRfbGluZV9pZCk7CisgICAgdmFy
IGNvbW1lbnRfYmxvY2sgPSBjcmVhdGVDb21tZW50Rm9yKGxpbmUpOworICAgICQoY29tbWVudF9i
bG9jaykuY2hpbGRyZW4oJ3RleHRhcmVhJykudmFsKGNvbnRlbnRzKTsKKyAgICBmcmVlemVDb21t
ZW50KGNvbW1lbnRfYmxvY2spOworCisgICAgdmFyIHN0YXJ0ID0gbnVtYmVyRnJvbShzdGFydF9s
aW5lX2lkKTsKKyAgICB2YXIgZW5kID0gbnVtYmVyRnJvbShlbmRfbGluZV9pZCk7CisgICAgZm9y
ICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisgICAgICB2YXIgbGluZSA9ICQoJyNs
aW5lJyArIGkpOworICAgICAgbGluZS5hZGRDbGFzcygnY29tbWVudENvbnRleHQnKTsKKyAgICAg
IGFkZERhdGFDb21tZW50QmFzZUxpbmUobGluZSwgZW5kX2xpbmVfaWQpOworICAgIH0KKyAgfQor
CisgIGZ1bmN0aW9uIGRpc3BsYXlEcmFmdENvbW1lbnRzKCkgeworICAgIHZhciBzZXJpYWxpemVk
X2NvbW1lbnRzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRh
Y2htZW50LScgKyBhdHRhY2htZW50X2lkKTsKKyAgICBpZiAoIXNlcmlhbGl6ZWRfY29tbWVudHMp
CisgICAgICByZXR1cm47CisKKyAgICAkKEpTT04ucGFyc2Uoc2VyaWFsaXplZF9jb21tZW50cykp
LmVhY2goZnVuY3Rpb24oKSB7CisgICAgICBhZGREcmFmdENvbW1lbnQodGhpcy5zdGFydF9saW5l
X2lkLCB0aGlzLmVuZF9saW5lX2lkLCB0aGlzLmNvbnRlbnRzKTsKKyAgICB9KTsKKyAgfQorCisg
IGZ1bmN0aW9uIHNhdmVEcmFmdENvbW1lbnRzKCkgeworICAgIHZhciBjb21tZW50cyA9ICQoJy5j
b21tZW50Jyk7CisgICAgdmFyIGNvbW1lbnRfc3RvcmUgPSBbXTsKKyAgICBjb21tZW50cy5lYWNo
KGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBmaWxlX2RpZmYgPSBmaWxlRGlmZkZvcih0aGlzKTsK
KyAgICAgIHZhciB0ZXh0YXJlYSA9ICQoJ3RleHRhcmVhJywgdGhpcyk7CisgICAgICB2YXIgY29t
bWVudF9iYXNlX2xpbmUgPSB0ZXh0YXJlYS5hdHRyKCdkYXRhLWNvbW1lbnQtZm9yJyk7CisgICAg
ICB2YXIgbGluZXMgPSBjb250ZXh0TGluZXNGb3IoY29tbWVudF9iYXNlX2xpbmUsIGZpbGVfZGlm
Zik7CisgICAgICBjb21tZW50X3N0b3JlLnB1c2goeworICAgICAgICBzdGFydF9saW5lX2lkOiBs
aW5lcy5maXJzdCgpLmF0dHIoJ2lkJyksCisgICAgICAgIGVuZF9saW5lX2lkOiBjb21tZW50X2Jh
c2VfbGluZSwKKyAgICAgICAgY29udGVudHM6IHRleHRhcmVhLnZhbCgpLnRyaW0oKQorICAgICAg
fSk7CisgICAgfSk7CisgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RyYWZ0LWNvbW1lbnRzLWZv
ci1hdHRhY2htZW50LScgKyBhdHRhY2htZW50X2lkLCBKU09OLnN0cmluZ2lmeShjb21tZW50X3N0
b3JlKSk7CisgIH0KKworICBmdW5jdGlvbiBjbGVhckRyYWZ0Q29tbWVudHMoKSB7CisgICAgbG9j
YWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LScgKyBh
dHRhY2htZW50X2lkKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnRGb3IobGluZSkg
ewogICAgIGlmIChsaW5lLmF0dHIoJ2RhdGEtaGFzLWNvbW1lbnQnKSkgewogICAgICAgLy8gRklY
TUU6IFRoaXMgcXVlcnkgaXMgb3Zlcmx5IGNvbXBsZXggYmVjYXVzZSB3ZSBwbGFjZSBjb21tZW50
IGJsb2NrcwogICAgICAgLy8gYWZ0ZXIgTGluZXMuICBJbnN0ZWFkLCBjb21tZW50IGJsb2NrcyBz
aG91bGQgYmUgY2hpbGRyZW4gb2YgTGluZXMuCkBAIC0xNDEsNiArMTg3LDExIEBACiAKICAgICB2
YXIgY29tbWVudF9ibG9jayA9ICQoJzxkaXYgY2xhc3M9ImNvbW1lbnQiPjx0ZXh0YXJlYSBkYXRh
LWNvbW1lbnQtZm9yPSInICsgbGluZS5hdHRyKCdpZCcpICsgJyI+PC90ZXh0YXJlYT48ZGl2IGNs
YXNzPSJhY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJvayI+T0s8L2J1dHRvbj48YnV0dG9uIGNsYXNz
PSJkaXNjYXJkIj5EaXNjYXJkPC9idXR0b24+PC9kaXY+PC9kaXY+Jyk7CiAgICAgaW5zZXJ0Q29t
bWVudEZvcihsaW5lLCBjb21tZW50X2Jsb2NrKTsKKyAgICByZXR1cm4gY29tbWVudF9ibG9jazsK
KyAgfQorCisgIGZ1bmN0aW9uIGFkZENvbW1lbnRGb3IobGluZSkgeworICAgIHZhciBjb21tZW50
X2Jsb2NrID0gY3JlYXRlQ29tbWVudEZvcihsaW5lKTsKICAgICBjb21tZW50X2Jsb2NrLmhpZGUo
KS5zbGlkZURvd24oJ2Zhc3QnLCBmdW5jdGlvbigpIHsKICAgICAgICQodGhpcykuY2hpbGRyZW4o
J3RleHRhcmVhJykuZm9jdXMoKTsKICAgICB9KTsKQEAgLTMyNyw2ICszNzgsNyBAQAogICAgICAg
ICAgICAgJC5tZXJnZShjb21tZW50cywgc2NhbkZvclN0eWxlUXVldWVDb21tZW50cyh0ZXh0KSk7
CiAgICAgICAgIH0pOwogICAgICAgICBkaXNwbGF5UHJldmlvdXNDb21tZW50cyhjb21tZW50cyk7
CisgICAgICAgIGRpc3BsYXlEcmFmdENvbW1lbnRzKCk7CiAgICAgICB9KTsKIAogICAgICAgdmFy
IGRldGFpbHMgPSAkKGRhdGEpOwpAQCAtODMzLDYgKzg4NSw3IEBACiAgICAgJCgnLm92ZXJhbGxD
b21tZW50cyB0ZXh0YXJlYScpLmJpbmQoJ2NsaWNrJywgb3Blbk92ZXJhbGxDb21tZW50cyk7CiAK
ICAgICAkKGRvY3VtZW50LmJvZHkpLnByZXBlbmQoJzxkaXYgaWQ9ImNvbW1lbnRfZm9ybSIgY2xh
c3M9ImluYWN0aXZlIj48ZGl2IGNsYXNzPSJ3aW50ZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImxpZ2h0
Ym94Ij48aWZyYW1lIGlkPSJyZXZpZXdmb3JtIiBzcmM9ImF0dGFjaG1lbnQuY2dpP2lkPScgKyBh
dHRhY2htZW50X2lkICsgJyZhY3Rpb249cmV2aWV3Zm9ybSI+PC9pZnJhbWU+PC9kaXY+PC9kaXY+
Jyk7CisgICAgJCgnI3Jldmlld2Zvcm0nKS5iaW5kKCdsb2FkJywgaGFuZGxlUmV2aWV3Rm9ybUxv
YWQpOwogCiAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgaWZyYW1lIGFuZCBtb25pdG9yIHJlc2l6ZXMg
aW4gaXQncyBjb250ZW50V2luZG93IHRvIGRldGVjdCB3aGVuIHRoZSB0b3AgZG9jdW1lbnQncyBi
b2R5IGNoYW5nZXMgc2l6ZS4KICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHNldFRpbWVvdXQgdGhy
b3R0bGUgdGhlc2U/CkBAIC04NDQsNiArODk3LDE1IEBACiAgICAgbG9hZERpZmZTdGF0ZSgpOwog
ICB9KTsKIAorICBmdW5jdGlvbiBoYW5kbGVSZXZpZXdGb3JtTG9hZCgpIHsKKyAgICB2YXIgZm9y
bSA9ICQoJyNyZXZpZXdmb3JtJykuY29udGVudHMoKS5maW5kKCdmb3JtJylbMF07CisgICAgdmFy
IG9sZF9zdWJtaXQgPSBmb3JtLm9uc3VibWl0OworICAgIGZvcm0ub25zdWJtaXQgPSBmdW5jdGlv
bigpIHsKKyAgICAgIGNsZWFyRHJhZnRDb21tZW50cygpOworICAgICAgcmV0dXJuIG9sZF9zdWJt
aXQoKTsKKyAgICB9OworICB9CisKICAgZnVuY3Rpb24gbG9hZERpZmZTdGF0ZSgpIHsKICAgICB2
YXIgZGlmZnN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NvZGUtcmV2aWV3LWRpZmZzdGF0
ZScpOwogICAgIGlmIChkaWZmc3RhdGUgIT0gJ3NpZGVieXNpZGUnICYmIGRpZmZzdGF0ZSAhPSAn
dW5pZmllZCcpCkBAIC0xMDA1LDEzICsxMDY3LDE0IEBACiAgICAgcmV0dXJuIGZyYWdtZW50Owog
ICB9CiAKLSAgZnVuY3Rpb24gZGlzY2FyZENvbW1lbnQoKSB7Ci0gICAgdmFyIGxpbmVfaWQgPSAk
KHRoaXMpLnBhcmVudHNVbnRpbCgnLmNvbW1lbnQnKS5wYXJlbnQoKS5maW5kKCd0ZXh0YXJlYScp
LmF0dHIoJ2RhdGEtY29tbWVudC1mb3InKTsKKyAgZnVuY3Rpb24gZGlzY2FyZENvbW1lbnQoY29t
bWVudF9ibG9jaykgeworICAgIHZhciBsaW5lX2lkID0gY29tbWVudF9ibG9jay5maW5kKCd0ZXh0
YXJlYScpLmF0dHIoJ2RhdGEtY29tbWVudC1mb3InKTsKICAgICB2YXIgbGluZSA9ICQoJyMnICsg
bGluZV9pZCkKICAgICBmaW5kQ29tbWVudEJsb2NrRm9yKGxpbmUpLnNsaWRlVXAoJ2Zhc3QnLCBm
dW5jdGlvbigpIHsKICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICBsaW5lLnJlbW92ZUF0
dHIoJ2RhdGEtaGFzLWNvbW1lbnQnKTsKICAgICAgIHRyaW1Db21tZW50Q29udGV4dFRvQmVmb3Jl
KGxpbmUsIGxpbmUuYXR0cignZGF0YS1jb21tZW50LWJhc2UtbGluZScpKTsKKyAgICAgIHNhdmVE
cmFmdENvbW1lbnRzKCk7CiAgICAgfSk7CiAgIH0KIApAQCAtMTAzMywxOCArMTA5NiwyMyBAQAog
ICAkKCcuc2lkZS1ieS1zaWRlLWxpbmsnKS5saXZlKCdjbGljaycsIGhhbmRsZVNpZGVCeVNpZGVM
aW5rQ2xpY2spOwogICAkKCcudW5pZnktbGluaycpLmxpdmUoJ2NsaWNrJywgaGFuZGxlVW5pZnlM
aW5rQ2xpY2spOwogICAkKCcuRXhwYW5kTGluaycpLmxpdmUoJ2NsaWNrJywgaGFuZGxlRXhwYW5k
TGlua0NsaWNrKTsKLSAgJCgnLmNvbW1lbnQgLmRpc2NhcmQnKS5saXZlKCdjbGljaycsIGRpc2Nh
cmRDb21tZW50KTsKKyAgJCgnLmNvbW1lbnQgLmRpc2NhcmQnKS5saXZlKCdjbGljaycsIGZ1bmN0
aW9uKCkgeyBkaXNjYXJkQ29tbWVudCgkKHRoaXMpLnBhcmVudHMoJy5jb21tZW50JykpOyB9KTsK
ICAgJCgnLmZyb3plbkNvbW1lbnQnKS5saXZlKCdjbGljaycsIHVuZnJlZXplQ29tbWVudCk7CiAK
LSAgJCgnLmNvbW1lbnQgLm9rJykubGl2ZSgnY2xpY2snLCBmdW5jdGlvbigpIHsKLSAgICB2YXIg
Y29tbWVudF90ZXh0YXJlYSA9ICQodGhpcykucGFyZW50c1VudGlsKCcuY29tbWVudCcpLnBhcmVu
dCgpLmZpbmQoJ3RleHRhcmVhJyk7CisgIGZ1bmN0aW9uIGZyZWV6ZUNvbW1lbnQoY29tbWVudF9i
bG9jaykgeworICAgIHZhciBjb21tZW50X3RleHRhcmVhID0gY29tbWVudF9ibG9jay5maW5kKCd0
ZXh0YXJlYScpOwogICAgIGlmIChjb21tZW50X3RleHRhcmVhLnZhbCgpLnRyaW0oKSA9PSAnJykg
ewotICAgICAgZGlzY2FyZENvbW1lbnQuY2FsbCh0aGlzKTsKKyAgICAgIGRpc2NhcmRDb21tZW50
LmNhbGwoY29tbWVudF9ibG9jayk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIHZhciBsaW5l
X2lkID0gY29tbWVudF90ZXh0YXJlYS5hdHRyKCdkYXRhLWNvbW1lbnQtZm9yJyk7CiAgICAgdmFy
IGxpbmUgPSAkKCcjJyArIGxpbmVfaWQpCiAgICAgZmluZENvbW1lbnRCbG9ja0ZvcihsaW5lKS5o
aWRlKCkuYWZ0ZXIoJCgnPGRpdiBjbGFzcz0iZnJvemVuQ29tbWVudCI+PC9kaXY+JykudGV4dChj
b21tZW50X3RleHRhcmVhLnZhbCgpKSk7CisgIH0KKworICAkKCcuY29tbWVudCAub2snKS5saXZl
KCdjbGljaycsIGZ1bmN0aW9uKCkgeworICAgIGZyZWV6ZUNvbW1lbnQoJCh0aGlzKS5wYXJlbnRz
KCcuY29tbWVudCcpKTsKKyAgICBzYXZlRHJhZnRDb21tZW50cygpOwogICB9KTsKIAogICBmdW5j
dGlvbiBmb2N1c09uKG5vZGUpIHsKQEAgLTEyMDUsNiArMTI3Myw4IEBACiAgICAgc2VsZWN0ZWQu
ZWFjaChmdW5jdGlvbigpIHsKICAgICAgIGFkZERhdGFDb21tZW50QmFzZUxpbmUodGhpcywgY29t
bWVudF9iYXNlX2xpbmUpOwogICAgIH0pOworCisgICAgc2F2ZURyYWZ0Q29tbWVudHMoKTsKICAg
fSk7CiAKICAgZnVuY3Rpb24gYWRkRGF0YUNvbW1lbnRCYXNlTGluZShsaW5lLCBpZCkgewo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79821</attachid>
            <date>2011-01-21 20:14:10 -0800</date>
            <delta_ts>2011-02-01 15:53:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52866-20110121201408.patch</filename>
            <type>text/plain</type>
            <size>19008</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9DaGFuZ2VMb2cgYi9XZWJzaXRl
cy9idWdzLndlYmtpdC5vcmcvQ2hhbmdlTG9nCmluZGV4IDMxMjcwNTUwYjYzY2FiYjQwYTg2Zjgx
MWZiMGIyYWM3MTA3NDJkNTQuLjMwZGFlNWViOThjOWZiMDhhZGM4MzMyNDMxYjFlOWE4NDM2ZDJk
OWIgMTAwNjQ0Ci0tLSBhL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9DaGFuZ2VMb2cKKysrIGIv
V2Vic2l0ZXMvYnVncy53ZWJraXQub3JnL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDE1IEBACiAyMDEx
LTAxLTIwICBPamFuIFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CiAKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3RvcmUgZHJhZnQgY29tbWVudHMgaW4g
bG9jYWxTdG9yYWdlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD01Mjg2NgorCisgICAgICAgICogY29kZS1yZXZpZXcuanM6CisgICAgICAgICogY29kZS1y
ZXZpZXctdGVzdC5odG1sCisKKzIwMTEtMDEtMjAgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVt
Lm9yZz4KKwogICAgICAgICBGaXggdGhlIHJldmlldyB0b29sIGZvciBpbWFnZSBkaWZmcy4gV2Ug
d291bGQgZ2V0IGEgamF2YXNjcmlwdCBlcnJvcgogICAgICAgICBiZWNhdXNlIGltYWdlIGRpZmZz
IGRvbid0IGhhdmUgbGluZSBudW1iZXJzLgogCmRpZmYgLS1naXQgYS9XZWJzaXRlcy9idWdzLndl
YmtpdC5vcmcvY29kZS1yZXZpZXctdGVzdC5odG1sIGIvV2Vic2l0ZXMvYnVncy53ZWJraXQub3Jn
L2NvZGUtcmV2aWV3LXRlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43M2QzMDc5Mjg3NmI1MGUzMjY5NDNj
NTY0NDlkM2Y3YzFiZDQzNjBlCi0tLSAvZGV2L251bGwKKysrIGIvV2Vic2l0ZXMvYnVncy53ZWJr
aXQub3JnL2NvZGUtcmV2aWV3LXRlc3QuaHRtbApAQCAtMCwwICsxLDE0MCBAQAorPGRpdj5UZXN0
cyBmb3Igc29tZSBvZiB0aGUgZWFzaWx5IHVuaXR0ZXN0YWJsZSBwYXJ0cyBvZiBjb2RlLXJldmll
dy5qcy4gWW91IHNob3VsZCBzZWUgYSBzZXJpZXMgb2YgIlBBU1NFRCIgbGluZXMuPC9kaXY+Cis8
ZGl2PkZJWE1FOiBSdW4gdGhlc2UgYXMgcGFydCBvZiB0aGUgbGF5b3V0IHRlc3Qgc3VpdGU/PC9k
aXY+CisKKzxzY3JpcHQ+Q09ERV9SRVZJRVdfVU5JVFRFU1QgPSB0cnVlPC9zY3JpcHQ+Cis8c2Ny
aXB0IHNyYz0iY29kZS1yZXZpZXcuanMiPjwvc2NyaXB0PgorPHByZSBpZD0ib3V0cHV0Ij48L3By
ZT4KKzxzY3JpcHQ+CisKK2Z1bmN0aW9uIGluaGVyaXRzKGNoaWxkQ29uc3RydWN0b3IsIHBhcmVu
dENvbnN0cnVjdG9yKSB7CisgIGZ1bmN0aW9uIHRlbXBDb25zdHJ1Y3RvcigpIHt9OworICB0ZW1w
Q29uc3RydWN0b3IucHJvdG90eXBlID0gcGFyZW50Q29uc3RydWN0b3IucHJvdG90eXBlOworICBj
aGlsZENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ29uc3RydWN0b3IoKTsKKyAgY2hp
bGRDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZENvbnN0cnVjdG9yOwor
fQorCitmdW5jdGlvbiBNb2NrTG9jYWxTdG9yYWdlKCkgeworICAgIHRoaXMubG9jYWxTdG9yYWdl
U3RvcmUgPSB7fTsKKyAgICB0aGlzLmxvZyA9IFtdOworCisgICAgdGhpcy5nZXRJdGVtID0gZnVu
Y3Rpb24oa2V5KSB7CisgICAgICAgIHRoaXMubG9nLnB1c2goJ2dldEl0ZW06JyArIGtleSk7Cisg
ICAgICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZVN0b3JlW2tleV07CisgICAgfTsKKworICAg
IHRoaXMuc2V0SXRlbSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICAgICAgLy8gRm9yIHRl
c3Rpbmcgc2FrZSwgY29uc2lkZXIgaGF2aW5nIG1vcmUgdGhhbiAyIGl0ZW1zIHRvIGV4Y2VlZCB0
aGUgc3RvcmFnZSBxdW90YS4KKyAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubG9jYWxTdG9y
YWdlU3RvcmUpLmxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgIHRoaXMubG9nLnB1c2goJ1F1b3Rh
RXhjZWVkZWQgb24gc2V0SXRlbTonICsga2V5ICsgJywnICsgdmFsdWUpOworICAgICAgICAgICAg
dGhyb3cgIlF1b3RhRXhjZWVkZWQiOworICAgICAgICB9CisgICAgICAgIHRoaXMubG9nLnB1c2go
J3NldEl0ZW06JyArIGtleSArICcsJyArIHZhbHVlKTsKKyAgICAgICAgdGhpcy5sb2NhbFN0b3Jh
Z2VTdG9yZVtrZXldID0gdmFsdWU7CisgICAgfTsKKworICAgIHRoaXMucmVtb3ZlSXRlbSA9IGZ1
bmN0aW9uKGtleSkgeworICAgICAgICB0aGlzLmxvZy5wdXNoKCdyZW1vdmVJdGVtOicgKyBrZXkp
OworICAgICAgICBkZWxldGUgdGhpcy5sb2NhbFN0b3JhZ2VTdG9yZVtrZXldOworICAgIH07CisK
KyAgICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9nLmpv
aW4oJ1xuJyk7CisgICAgfTsKKworICAgIHRoaXMua2V5ID0gZnVuY3Rpb24oaSkgeworICAgICAg
ICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5sb2NhbFN0b3JhZ2VTdG9yZSlbaV07CisgICAgfTsK
KworICAgIHRoaXMuX19kZWZpbmVHZXR0ZXJfXygnbGVuZ3RoJywgZnVuY3Rpb24oKSB7CisgICAg
ICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmxvY2FsU3RvcmFnZVN0b3JlKS5sZW5ndGg7Cisg
ICAgfSk7Cit9CisKK2Z1bmN0aW9uIE1vY2tEcmFmdENvbW1lbnRTYXZlcihhdHRhY2htZW50X2lk
LCBvcHRfbG9jYWxTdG9yYWdlKSB7CisgICAgRHJhZnRDb21tZW50U2F2ZXIuY2FsbCh0aGlzLCBh
dHRhY2htZW50X2lkLCBvcHRfbG9jYWxTdG9yYWdlKTsKK30KKworaW5oZXJpdHMoTW9ja0RyYWZ0
Q29tbWVudFNhdmVyLCBEcmFmdENvbW1lbnRTYXZlcikKKworTW9ja0RyYWZ0Q29tbWVudFNhdmVy
LnByb3RvdHlwZS5fanNvbiA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAie01PQ0sgSlNPTn0i
OworfQorCitNb2NrRHJhZnRDb21tZW50U2F2ZXIucHJvdG90eXBlLl9wcm9tcHQgPSBmdW5jdGlv
bihtZXNzYWdlKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlvbiBsb2cobXNnKSB7
CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dHB1dCcpLmlubmVySFRNTCArPSBtc2cg
KyAnXG5cbic7Cit9CisKK2Z1bmN0aW9uIEFTU0VSVF9FUVVBTChhY3R1YWwsIGV4cGVjdGVkKSB7
CisgICAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkKKyAgICAgICAgbG9nKCdQQVNTRUQnKTsKKyAg
ICBlbHNlCisgICAgICAgIGxvZygnRkFJTEVEOlxuZ290OlxuJyArIGFjdHVhbCArICdcbmV4cGVj
dGVkOlxuJyArIGV4cGVjdGVkICsgJycpOworfQorCisvLyBCYXNpYyBzZXRJdGVtLgordmFyIGxz
ID0gbmV3IE1vY2tMb2NhbFN0b3JhZ2UoKTsKK25ldyBNb2NrRHJhZnRDb21tZW50U2F2ZXIoJzEy
MzQnLCBscykuc2F2ZSgpOworQVNTRVJUX0VRVUFMKGxzLmpzb24oKSwgJ3NldEl0ZW06ZHJhZnQt
Y29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMTIzNCx7TU9DSyBKU09OfScpOworCisvLyBFeGNlZWQg
cXVvdGEsIGJ1dCBzdWNjZWVkIGFmdGVyIGVyYXNpbmcgb2xkIHJldmlld3MuCit2YXIgbHMgPSBu
ZXcgTW9ja0xvY2FsU3RvcmFnZSgpOworbHMubG9jYWxTdG9yYWdlU3RvcmUgPSB7CisgICAgJ2Ry
YWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTEnOiAneyJib3JuLW9uIjogMTAwLCAiY29tbWVu
dHMiOltdfScsCisgICAgJ2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTInOiAneyJib3Ju
LW9uIjogMTAwLCAiY29tbWVudHMiOltdfScsCisgICAgJ2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRh
Y2htZW50LTMnOiAneyJib3JuLW9uIjogMTAwLCAiY29tbWVudHMiOltdfScsCisgICAgJ2RyYWZ0
LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTQnOiAneyJib3JuLW9uIjogJyArIChEYXRlLm5vdygp
IC0gMTAwKSArICcsICJjb21tZW50cyI6W119JworfTsKK25ldyBNb2NrRHJhZnRDb21tZW50U2F2
ZXIoJzEyMzQnLCBscykuc2F2ZSgpOworQVNTRVJUX0VRVUFMKGxzLmpzb24oKSwgJ1F1b3RhRXhj
ZWVkZWQgb24gc2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0xMjM0LHtNT0NL
IEpTT059XG5nZXRJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTFcbmdldEl0ZW06
ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMlxuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1m
b3ItYXR0YWNobWVudC0zXG5nZXRJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTRc
bnJlbW92ZUl0ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMVxucmVtb3ZlSXRlbTpk
cmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0yXG5yZW1vdmVJdGVtOmRyYWZ0LWNvbW1lbnRz
LWZvci1hdHRhY2htZW50LTNcbnNldEl0ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQt
MTIzNCx7TU9DSyBKU09OfScpOworCisvLyBFeGNlZWQgcXVvdGEgYWZ0ZXIgZXJhc2luZyBvbGQg
cmV2aWV3cyBhbmQgZmFpbCBhZnRlciBwcm9tcHQuCit2YXIgbHMgPSBuZXcgTW9ja0xvY2FsU3Rv
cmFnZSgpOworbHMubG9jYWxTdG9yYWdlU3RvcmUgPSB7CisgICAgJ2RyYWZ0LWNvbW1lbnRzLWZv
ci1hdHRhY2htZW50LTEnOiAneyJib3JuLW9uIjogMTAwLCAiY29tbWVudHMiOltdfScsCisgICAg
J2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTInOiAneyJib3JuLW9uIjogJyArIChEYXRl
Lm5vdygpIC0gMTAwKSArICcsICJjb21tZW50cyI6W119JywKKyAgICAnZHJhZnQtY29tbWVudHMt
Zm9yLWF0dGFjaG1lbnQtMyc6ICd7ImJvcm4tb24iOiAnICsgKERhdGUubm93KCkgLSAxMDApICsg
JywgImNvbW1lbnRzIjpbXX0nLAorICAgICdkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC00
JzogJ3siYm9ybi1vbiI6ICcgKyAoRGF0ZS5ub3coKSAtIDEwMCkgKyAnLCAiY29tbWVudHMiOltd
fScKK307Cit2YXIgbW9ja0RyYWZ0U2F2ZXIgPSBuZXcgTW9ja0RyYWZ0Q29tbWVudFNhdmVyKCcx
MjM0JywgbHMpOworbW9ja0RyYWZ0U2F2ZXIuc2F2ZSgpOworLy8gU2Vjb25kIHNhdmUgdG8gZW5z
dXJlIHRoYXQgd2Ugc3RvcCB0cnlpbmcgdG8gc2F2ZSB3aGVuIHdlIGZhaWwgdGhlIHByb21wdC4K
K21vY2tEcmFmdFNhdmVyLnNhdmUoKTsKK0FTU0VSVF9FUVVBTChscy5qc29uKCksICdRdW90YUV4
Y2VlZGVkIG9uIHNldEl0ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMTIzNCx7TU9D
SyBKU09OfVxuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0xXG5nZXRJdGVt
OmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTJcbmdldEl0ZW06ZHJhZnQtY29tbWVudHMt
Zm9yLWF0dGFjaG1lbnQtM1xuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC00
XG5yZW1vdmVJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTFcblF1b3RhRXhjZWVk
ZWQgb24gc2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0xMjM0LHtNT0NLIEpT
T059Jyk7CisKKy8vIEV4Y2VlZCBxdW90YSBhZnRlciBlcmFzaW5nIG9sZCByZXZpZXdzLCBidXQg
c3VjY2VlZCBhZnRlciBwcm9tcHQuCit2YXIgbHMgPSBuZXcgTW9ja0xvY2FsU3RvcmFnZSgpOwor
bHMubG9jYWxTdG9yYWdlU3RvcmUgPSB7CisgICAgJ2RyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2ht
ZW50LTEnOiAneyJib3JuLW9uIjogMTAwLCAiY29tbWVudHMiOltdfScsCisgICAgJ2RyYWZ0LWNv
bW1lbnRzLWZvci1hdHRhY2htZW50LTInOiAneyJib3JuLW9uIjogJyArIChEYXRlLm5vdygpIC0g
MTAwKSArICcsICJjb21tZW50cyI6W119JywKKyAgICAnZHJhZnQtY29tbWVudHMtZm9yLWF0dGFj
aG1lbnQtMyc6ICd7ImJvcm4tb24iOiAnICsgKERhdGUubm93KCkgLSAxMDApICsgJywgImNvbW1l
bnRzIjpbXX0nLAorICAgICdkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC00JzogJ3siYm9y
bi1vbiI6ICcgKyAoRGF0ZS5ub3coKSAtIDEwMCkgKyAnLCAiY29tbWVudHMiOltdfScKK307Cit2
YXIgbW9ja0RyYWZ0U2F2ZXIgPSBuZXcgTW9ja0RyYWZ0Q29tbWVudFNhdmVyKCcxMjM0JywgbHMp
OworbW9ja0RyYWZ0U2F2ZXIuX3Byb21wdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTsK
K21vY2tEcmFmdFNhdmVyLnNhdmUoKTsKK0FTU0VSVF9FUVVBTChscy5qc29uKCksICdRdW90YUV4
Y2VlZGVkIG9uIHNldEl0ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMTIzNCx7TU9D
SyBKU09OfVxuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0xXG5nZXRJdGVt
OmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTJcbmdldEl0ZW06ZHJhZnQtY29tbWVudHMt
Zm9yLWF0dGFjaG1lbnQtM1xuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC00
XG5yZW1vdmVJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTFcblF1b3RhRXhjZWVk
ZWQgb24gc2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0xMjM0LHtNT0NLIEpT
T059XG5yZW1vdmVJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTJcbnJlbW92ZUl0
ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtM1xucmVtb3ZlSXRlbTpkcmFmdC1jb21t
ZW50cy1mb3ItYXR0YWNobWVudC00XG5zZXRJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2ht
ZW50LTEyMzQse01PQ0sgSlNPTn0nKTsKKworLy8gQWx3YXlzIGV4Y2VlZHMgcXVvdGEsIGV2ZW4g
YWZ0ZXIgZXJhc2luZyBhbGwgcmV2aWV3IGNvbW1lbnRzLiBUaGVyZSBzaG91bGQgYmUgbm8gc2V0
SXRlbSBjYWxscy4KK3ZhciBscyA9IG5ldyBNb2NrTG9jYWxTdG9yYWdlKCk7Citscy5zZXRJdGVt
ID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5sb2cucHVzaCgnUXVvdGFFeGNlZWRlZCBvbiBzZXRJ
dGVtOicgKyBrZXkgKyAnLCcgKyB2YWx1ZSk7CisgICAgdGhyb3cgIlF1b3RhRXhjZWVkZWQiOyAK
K30KK2xzLmxvY2FsU3RvcmFnZVN0b3JlID0geworICAgICdkcmFmdC1jb21tZW50cy1mb3ItYXR0
YWNobWVudC0xJzogJ3siYm9ybi1vbiI6IDEwMCwgImNvbW1lbnRzIjpbXX0nLAorICAgICdkcmFm
dC1jb21tZW50cy1mb3ItYXR0YWNobWVudC0yJzogJ3siYm9ybi1vbiI6ICcgKyAoRGF0ZS5ub3co
KSAtIDEwMCkgKyAnLCAiY29tbWVudHMiOltdfScsCisgICAgJ2RyYWZ0LWNvbW1lbnRzLWZvci1h
dHRhY2htZW50LTMnOiAneyJib3JuLW9uIjogJyArIChEYXRlLm5vdygpIC0gMTAwKSArICcsICJj
b21tZW50cyI6W119JywKKyAgICAnZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtNCc6ICd7
ImJvcm4tb24iOiAnICsgKERhdGUubm93KCkgLSAxMDApICsgJywgImNvbW1lbnRzIjpbXX0nCit9
OwordmFyIG1vY2tEcmFmdFNhdmVyID0gbmV3IE1vY2tEcmFmdENvbW1lbnRTYXZlcignMTIzNCcs
IGxzKTsKK21vY2tEcmFmdFNhdmVyLl9wcm9tcHQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7
IH07Cittb2NrRHJhZnRTYXZlci5zYXZlKCk7CisvLyBTZWNvbmQgc2F2ZSB0byBlbnN1cmUgdGhh
dCB3ZSBzdG9wIHRyeWluZyB0byBzYXZlIHdoZW4gd2UgZmFpbCB0aGUgcHJvbXB0LgorbW9ja0Ry
YWZ0U2F2ZXIuc2F2ZSgpOworQVNTRVJUX0VRVUFMKGxzLmpzb24oKSwgJ2dldEl0ZW06ZHJhZnQt
Y29tbWVudHMtZm9yLWF0dGFjaG1lbnQtMVxuZ2V0SXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0
YWNobWVudC0yXG5nZXRJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRhY2htZW50LTNcbmdldEl0
ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtNFxucmVtb3ZlSXRlbTpkcmFmdC1jb21t
ZW50cy1mb3ItYXR0YWNobWVudC0xXG5yZW1vdmVJdGVtOmRyYWZ0LWNvbW1lbnRzLWZvci1hdHRh
Y2htZW50LTJcbnJlbW92ZUl0ZW06ZHJhZnQtY29tbWVudHMtZm9yLWF0dGFjaG1lbnQtM1xucmVt
b3ZlSXRlbTpkcmFmdC1jb21tZW50cy1mb3ItYXR0YWNobWVudC00Jyk7CisKKzwvc2NyaXB0Pgpk
aWZmIC0tZ2l0IGEvV2Vic2l0ZXMvYnVncy53ZWJraXQub3JnL2NvZGUtcmV2aWV3LmpzIGIvV2Vi
c2l0ZXMvYnVncy53ZWJraXQub3JnL2NvZGUtcmV2aWV3LmpzCmluZGV4IDc5YjQ5NzU1NTA4Njlh
ZTM5Y2Y1NGE3YjRjNzlkNmY3ZjIxOTMzOWUuLjM1NTU4NzI5YjA0YWRmNTYwYjIzODNiOTc2NzBk
YjM0NTdmMzdhNDMgMTAwNjQ0Ci0tLSBhL1dlYnNpdGVzL2J1Z3Mud2Via2l0Lm9yZy9jb2RlLXJl
dmlldy5qcworKysgYi9XZWJzaXRlcy9idWdzLndlYmtpdC5vcmcvY29kZS1yZXZpZXcuanMKQEAg
LTIxLDYgKzIxLDcgQEAKIC8vIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKIC8vIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SAogLy8gREFNQUdFLgordmFyIENPREVfUkVWSUVXX1VOSVRURVNUOwogCiAoZnVuY3Rpb24oKSB7
CiAgIC8qKgpAQCAtNTQsNyArNTUsNyBAQAogICBpZiAod2luZG93LnRvcCAhPSB3aW5kb3cpCiAg
ICAgcmV0dXJuOwogCi0gIGlmICghd2luZG93LmxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvYWN0aW9u
PXJldmlldy8pCisgIGlmICghQ09ERV9SRVZJRVdfVU5JVFRFU1QgJiYgIXdpbmRvdy5sb2NhdGlv
bi5zZWFyY2gubWF0Y2goL2FjdGlvbj1yZXZpZXcvKQogICAgICAgJiYgIXdpbmRvdy5sb2NhdGlv
bi50b1N0cmluZygpLm1hdGNoKC9idWdzXC53ZWJraXRcLm9yZ1wvUHJldHR5UGF0Y2gvKSkKICAg
ICByZXR1cm47CiAKQEAgLTY4LDYgKzY5LDcgQEAKICAgdmFyIHBhdGNoZWRfZmlsZV9jb250ZW50
cyA9IHt9OwogICB2YXIgV0VCS0lUX0JBU0VfRElSID0gImh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9y
ZXBvc2l0b3J5L3dlYmtpdC90cnVuay8iOwogICB2YXIgU0lERV9CWV9TSURFX0RJRkZTX0tFWSA9
ICdzaWRlYnlzaWRlZGlmZnMnOworICB2YXIgZ19kaXNwbGF5ZWREcmFmdENvbW1lbnRzID0gZmFs
c2U7CiAKICAgZnVuY3Rpb24gaWRGb3JMaW5lKG51bWJlcikgewogICAgIHJldHVybiAnbGluZScg
KyBudW1iZXI7CkBAIC05Nyw3ICs5OSw3IEBACiAgIH0KIAogICBmdW5jdGlvbiBmaWxlRGlmZkZv
cihsaW5lKSB7Ci0gICAgcmV0dXJuIGxpbmUucGFyZW50cygnLkZpbGVEaWZmJyk7CisgICAgcmV0
dXJuICQobGluZSkucGFyZW50cygnLkZpbGVEaWZmJyk7CiAgIH0KIAogICBmdW5jdGlvbiBhY3Rp
dmVDb21tZW50Rm9yKGxpbmUpIHsKQEAgLTEyOSw3ICsxMzEsMTczIEBACiAgICAgZmluZENvbW1l
bnRQb3NpdGlvbkZvcihsaW5lKS5hZnRlcihibG9jayk7CiAgIH0KIAotICBmdW5jdGlvbiBhZGRD
b21tZW50Rm9yKGxpbmUpIHsKKyAgZnVuY3Rpb24gYWRkRHJhZnRDb21tZW50KHN0YXJ0X2xpbmVf
aWQsIGVuZF9saW5lX2lkLCBjb250ZW50cykgeworICAgIHZhciBsaW5lID0gJCgnIycgKyBlbmRf
bGluZV9pZCk7CisgICAgdmFyIHN0YXJ0ID0gbnVtYmVyRnJvbShzdGFydF9saW5lX2lkKTsKKyAg
ICB2YXIgZW5kID0gbnVtYmVyRnJvbShlbmRfbGluZV9pZCk7CisgICAgZm9yICh2YXIgaSA9IHN0
YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisgICAgICB2YXIgbGluZSA9ICQoJyNsaW5lJyArIGkpOwor
ICAgICAgbGluZS5hZGRDbGFzcygnY29tbWVudENvbnRleHQnKTsKKyAgICAgIGFkZERhdGFDb21t
ZW50QmFzZUxpbmUobGluZSwgZW5kX2xpbmVfaWQpOworICAgIH0KKworICAgIHZhciBjb21tZW50
X2Jsb2NrID0gY3JlYXRlQ29tbWVudEZvcihsaW5lKTsKKyAgICAkKGNvbW1lbnRfYmxvY2spLmNo
aWxkcmVuKCd0ZXh0YXJlYScpLnZhbChjb250ZW50cyk7CisgICAgZnJlZXplQ29tbWVudChjb21t
ZW50X2Jsb2NrKTsKKyAgfQorCisgIGZ1bmN0aW9uIGVuc3VyZURyYWZ0Q29tbWVudHNEaXNwbGF5
ZWQoKSB7CisgICAgaWYgKGdfZGlzcGxheWVkRHJhZnRDb21tZW50cykKKyAgICAgIHJldHVybjsK
KyAgICAgIAorICAgIGdfZGlzcGxheWVkRHJhZnRDb21tZW50cyA9IHRydWU7CisgICAgdmFyIHNl
cmlhbGl6ZWRfY29tbWVudHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShEcmFmdENvbW1lbnRTYXZl
ci5fa2V5UHJlZml4ICsgYXR0YWNobWVudF9pZCk7CisgICAgaWYgKCFzZXJpYWxpemVkX2NvbW1l
bnRzKQorICAgICAgcmV0dXJuOworCisgICAgdmFyIGNvbW1lbnRzOworICAgIHZhciBjb21tZW50
c19wYXJzZWQgPSB0cnVlOworICAgIHRyeSB7CisgICAgICBjb21tZW50cyA9IEpTT04ucGFyc2Uo
c2VyaWFsaXplZF9jb21tZW50cykuY29tbWVudHM7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAg
Y29tbWVudHNfcGFyc2VkID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIFNhbml0eSBjaGVj
ayBjb21tZW50cyBhcmUgYXMgZXhwZWN0ZWQuCisgICAgaWYgKCFjb21tZW50c19wYXJzZWQgfHwg
IWNvbW1lbnRzWzBdLmNvbnRlbnRzKSB7CisgICAgICAvLyBGSVhNRTogU2hvdyBhbiBlcnJvciB0
byB0aGUgdXNlciBpbnN0ZWFkIG9mIGxvZ2dpbmcuCisgICAgICBjb25zb2xlLmxvZygnRHJhZnQg
Y29tbWVudHMgd2VyZSBjb3JydXB0ZWQuIEVyYXNpbmcgY29tbWVudHMuJyk7CisgICAgICBjb21t
ZW50cyA9IFtdOworICAgICAgZ19kcmFmdENvbW1lbnRTYXZlci5lcmFzZSgpOworICAgIH0KKwor
ICAgICQoY29tbWVudHMpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICBhZGREcmFmdENvbW1lbnQo
dGhpcy5zdGFydF9saW5lX2lkLCB0aGlzLmVuZF9saW5lX2lkLCB0aGlzLmNvbnRlbnRzKTsKKyAg
ICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIERyYWZ0Q29tbWVudFNhdmVyKG9wdF9hdHRhY2htZW50
X2lkLCBvcHRfbG9jYWxTdG9yYWdlKSB7CisgICAgdGhpcy5fYXR0YWNobWVudF9pZCA9IG9wdF9h
dHRhY2htZW50X2lkIHx8IGF0dGFjaG1lbnRfaWQ7CisgICAgdGhpcy5fbG9jYWxTdG9yYWdlID0g
b3B0X2xvY2FsU3RvcmFnZSB8fCBsb2NhbFN0b3JhZ2U7CisgICAgdGhpcy5fc2F2ZUNvbW1lbnRz
ID0gdHJ1ZTsKKyAgfQorCisgIC8vIEV4cG9ydCB0aGlzIHNvIHdlIGNhbiB1bml0dGVzdCBpdC4K
KyAgd2luZG93WydEcmFmdENvbW1lbnRTYXZlciddID0gRHJhZnRDb21tZW50U2F2ZXI7CisgIAor
ICBEcmFmdENvbW1lbnRTYXZlci5wcm90b3R5cGUuX2pzb24gPSBmdW5jdGlvbigpIHsKKyAgICB2
YXIgY29tbWVudHMgPSAkKCcuY29tbWVudCcpOworICAgIHZhciBjb21tZW50X3N0b3JlID0gW107
CisgICAgY29tbWVudHMuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZmlsZV9kaWZmID0g
ZmlsZURpZmZGb3IodGhpcyk7CisgICAgICB2YXIgdGV4dGFyZWEgPSAkKCd0ZXh0YXJlYScsIHRo
aXMpOworCisgICAgICB2YXIgY29udGVudHMgPSB0ZXh0YXJlYS52YWwoKS50cmltKCk7CisgICAg
ICBpZiAoIWNvbnRlbnRzKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHZhciBjb21tZW50X2Jh
c2VfbGluZSA9IHRleHRhcmVhLmF0dHIoJ2RhdGEtY29tbWVudC1mb3InKTsKKyAgICAgIHZhciBs
aW5lcyA9IGNvbnRleHRMaW5lc0Zvcihjb21tZW50X2Jhc2VfbGluZSwgZmlsZV9kaWZmKTsKKwor
ICAgICAgY29tbWVudF9zdG9yZS5wdXNoKHsKKyAgICAgICAgc3RhcnRfbGluZV9pZDogbGluZXMu
Zmlyc3QoKS5hdHRyKCdpZCcpLAorICAgICAgICBlbmRfbGluZV9pZDogY29tbWVudF9iYXNlX2xp
bmUsCisgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cworICAgICAgfSk7CisgICAgfSk7CisKKyAg
ICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeydib3JuLW9uJzogRGF0ZS5ub3coKSwgJ2NvbW1lbnRz
JzogY29tbWVudF9zdG9yZX0pOworICB9CisgIAorICBEcmFmdENvbW1lbnRTYXZlci5wcm90b3R5
cGUuc2F2ZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy5fc2F2ZUNvbW1lbnRzKQorICAg
ICAgcmV0dXJuOworCisgICAgdmFyIGtleSA9IERyYWZ0Q29tbWVudFNhdmVyLl9rZXlQcmVmaXgg
KyB0aGlzLl9hdHRhY2htZW50X2lkOworICAgIHZhciB2YWx1ZSA9IHRoaXMuX2pzb24oKTsKKwor
ICAgIGlmICh0aGlzLl9hdHRlbXB0VG9Xcml0ZShrZXksIHZhbHVlKSkKKyAgICAgIHJldHVybjsK
KworICAgIHRoaXMuX2VyYXNlT2xkQ29tbWVudHNGb3JBbGxSZXZpZXdzKCk7CisgICAgaWYgKHRo
aXMuX2F0dGVtcHRUb1dyaXRlKGtleSwgdmFsdWUpKQorICAgICAgcmV0dXJuOworCisgICAgdmFy
IGJvb2wgPSB0aGlzLl9wcm9tcHQoJ0xvY2FsIHN0b3JhZ2UgcXVvdGEgaXMgZnVsbC4gUmVtb3Zl
IGRyYWZ0IGNvbW1lbnRzIGZyb20gYWxsIHJldmlld3MgdG8gbWFrZSByb29tPycpOworICAgIGlm
ICghYm9vbCkgeworICAgICAgdGhpcy5fc2F2ZUNvbW1lbnRzID0gZmFsc2U7CisgICAgICByZXR1
cm47CisgICAgfQorCisgICAgdGhpcy5fZXJhc2VDb21tZW50c0ZvckFsbFJldmlld3MoKTsKKyAg
ICBpZiAodGhpcy5fYXR0ZW1wdFRvV3JpdGUoa2V5LCB2YWx1ZSkpCisgICAgICByZXR1cm47CisK
KyAgICB0aGlzLl9zYXZlQ29tbWVudHMgPSBmYWxzZTsKKyAgICAvLyBGSVhNRTogU2hvdyBhbiBl
cnJvciB0byB0aGUgdXNlci4KKyAgfQorCisgIERyYWZ0Q29tbWVudFNhdmVyLnByb3RvdHlwZS5f
cHJvbXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgeworICAgIHJldHVybiBwcm9tcHQoJ0xvY2FsIHN0
b3JhZ2UgcXVvdGEgaXMgZnVsbC4gUmVtb3ZlIGRyYWZ0IGNvbW1lbnRzIGZyb20gYWxsIHJldmll
d3MgdG8gbWFrZSByb29tPycpOzsKKyAgfQorCisgIERyYWZ0Q29tbWVudFNhdmVyLnByb3RvdHlw
ZS5fYXR0ZW1wdFRvV3JpdGUgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAg
ICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOworICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
fQorCisgIERyYWZ0Q29tbWVudFNhdmVyLl9rZXlQcmVmaXggPSAnZHJhZnQtY29tbWVudHMtZm9y
LWF0dGFjaG1lbnQtJzsKKworICBEcmFmdENvbW1lbnRTYXZlci5wcm90b3R5cGUuZXJhc2UgPSBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShEcmFmdENvbW1l
bnRTYXZlci5fa2V5UHJlZml4ICsgdGhpcy5fYXR0YWNobWVudF9pZCk7CisgIH0KKworICBEcmFm
dENvbW1lbnRTYXZlci5wcm90b3R5cGUuX2VyYXNlT2xkQ29tbWVudHNGb3JBbGxSZXZpZXdzID0g
ZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fZXJhc2VDb21tZW50cyh0cnVlKTsKKyAgfQorICBEcmFm
dENvbW1lbnRTYXZlci5wcm90b3R5cGUuX2VyYXNlQ29tbWVudHNGb3JBbGxSZXZpZXdzID0gZnVu
Y3Rpb24oKSB7CisgICAgdGhpcy5fZXJhc2VDb21tZW50cyhmYWxzZSk7CisgIH0KKworICB2YXIg
TU9OVEhfSU5fTVMgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMzA7CisKKyAgRHJhZnRDb21tZW50
U2F2ZXIucHJvdG90eXBlLl9lcmFzZUNvbW1lbnRzID0gZnVuY3Rpb24ob25seV9vbGRfcmV2aWV3
cykgeworICAgIHZhciBsZW5ndGggPSB0aGlzLl9sb2NhbFN0b3JhZ2UubGVuZ3RoOworICAgIHZh
ciBkcmFmdF9jb21tZW50X2tleXMgPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0
aDsgaSsrKSB7CisgICAgICB2YXIga2V5ID0gdGhpcy5fbG9jYWxTdG9yYWdlLmtleShpKTsKKyAg
ICAgIGlmIChrZXkuaW5kZXhPZihEcmFmdENvbW1lbnRTYXZlci5fa2V5UHJlZml4KSA9PSAwKSB7
CisgICAgICAgIGlmIChvbmx5X29sZF9yZXZpZXdzKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAg
ICAgICAgIHZhciBib3JuX29uID0gSlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRl
bShrZXkpKVsnYm9ybi1vbiddOworICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAg
IGNvbnNvbGUubG9nKCdEZWxldGluZyBKU09OLiBKU09OIGZvciBjb2RlIHJldmlldyBpcyBjb3Jy
dXB0OiAnICsga2V5KTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKERh
dGUubm93KCkgLSBib3JuX29uIDwgTU9OVEhfSU5fTVMpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorICAgICAgICBkcmFmdF9jb21tZW50X2tleXMucHVzaChrZXkpOworICAgICAg
fQorICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhZnRfY29tbWVudF9rZXlzLmxl
bmd0aDsgaSsrKSB7CisgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShkcmFmdF9j
b21tZW50X2tleXNbaV0pOworICAgIH0KKyAgfQorICAKKyAgdmFyIGdfZHJhZnRDb21tZW50U2F2
ZXIgPSBuZXcgRHJhZnRDb21tZW50U2F2ZXIoKTsKKworICBmdW5jdGlvbiBzYXZlRHJhZnRDb21t
ZW50cygpIHsKKyAgICBlbnN1cmVEcmFmdENvbW1lbnRzRGlzcGxheWVkKCk7CisgICAgZ19kcmFm
dENvbW1lbnRTYXZlci5zYXZlKCk7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVDb21tZW50Rm9y
KGxpbmUpIHsKICAgICBpZiAobGluZS5hdHRyKCdkYXRhLWhhcy1jb21tZW50JykpIHsKICAgICAg
IC8vIEZJWE1FOiBUaGlzIHF1ZXJ5IGlzIG92ZXJseSBjb21wbGV4IGJlY2F1c2Ugd2UgcGxhY2Ug
Y29tbWVudCBibG9ja3MKICAgICAgIC8vIGFmdGVyIExpbmVzLiAgSW5zdGVhZCwgY29tbWVudCBi
bG9ja3Mgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIExpbmVzLgpAQCAtMTQxLDYgKzMwOSwxMSBAQAog
CiAgICAgdmFyIGNvbW1lbnRfYmxvY2sgPSAkKCc8ZGl2IGNsYXNzPSJjb21tZW50Ij48dGV4dGFy
ZWEgZGF0YS1jb21tZW50LWZvcj0iJyArIGxpbmUuYXR0cignaWQnKSArICciPjwvdGV4dGFyZWE+
PGRpdiBjbGFzcz0iYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0ib2siPk9LPC9idXR0b24+PGJ1dHRv
biBjbGFzcz0iZGlzY2FyZCI+RGlzY2FyZDwvYnV0dG9uPjwvZGl2PjwvZGl2PicpOwogICAgIGlu
c2VydENvbW1lbnRGb3IobGluZSwgY29tbWVudF9ibG9jayk7CisgICAgcmV0dXJuIGNvbW1lbnRf
YmxvY2s7CisgIH0KKworICBmdW5jdGlvbiBhZGRDb21tZW50Rm9yKGxpbmUpIHsKKyAgICB2YXIg
Y29tbWVudF9ibG9jayA9IGNyZWF0ZUNvbW1lbnRGb3IobGluZSk7CiAgICAgY29tbWVudF9ibG9j
ay5oaWRlKCkuc2xpZGVEb3duKCdmYXN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAkKHRoaXMpLmNo
aWxkcmVuKCd0ZXh0YXJlYScpLmZvY3VzKCk7CiAgICAgfSk7CkBAIC0zMjcsNiArNTAwLDcgQEAK
ICAgICAgICAgICAgICQubWVyZ2UoY29tbWVudHMsIHNjYW5Gb3JTdHlsZVF1ZXVlQ29tbWVudHMo
dGV4dCkpOwogICAgICAgICB9KTsKICAgICAgICAgZGlzcGxheVByZXZpb3VzQ29tbWVudHMoY29t
bWVudHMpOworICAgICAgICBlbnN1cmVEcmFmdENvbW1lbnRzRGlzcGxheWVkKCk7CiAgICAgICB9
KTsKIAogICAgICAgdmFyIGRldGFpbHMgPSAkKGRhdGEpOwpAQCAtODA2LDYgKzk4MCw3IEBACiAg
ICAgICAnPGEgaHJlZj0iamF2YXNjcmlwdDoiIGNsYXNzPSJzaWRlLWJ5LXNpZGUtbGluayI+c2lk
ZS1ieS1zaWRlPC9hPic7CiAgIH0KIAorCiAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkg
ewogICAgIGNyYXdsRGlmZigpOwogICAgIGZldGNoSGlzdG9yeSgpOwpAQCAtODMzLDYgKzEwMDgs
NyBAQAogICAgICQoJy5vdmVyYWxsQ29tbWVudHMgdGV4dGFyZWEnKS5iaW5kKCdjbGljaycsIG9w
ZW5PdmVyYWxsQ29tbWVudHMpOwogCiAgICAgJChkb2N1bWVudC5ib2R5KS5wcmVwZW5kKCc8ZGl2
IGlkPSJjb21tZW50X2Zvcm0iIGNsYXNzPSJpbmFjdGl2ZSI+PGRpdiBjbGFzcz0id2ludGVyIj48
L2Rpdj48ZGl2IGNsYXNzPSJsaWdodGJveCI+PGlmcmFtZSBpZD0icmV2aWV3Zm9ybSIgc3JjPSJh
dHRhY2htZW50LmNnaT9pZD0nICsgYXR0YWNobWVudF9pZCArICcmYWN0aW9uPXJldmlld2Zvcm0i
PjwvaWZyYW1lPjwvZGl2PjwvZGl2PicpOworICAgICQoJyNyZXZpZXdmb3JtJykuYmluZCgnbG9h
ZCcsIGhhbmRsZVJldmlld0Zvcm1Mb2FkKTsKIAogICAgIC8vIENyZWF0ZSBhIGR1bW15IGlmcmFt
ZSBhbmQgbW9uaXRvciByZXNpemVzIGluIGl0J3MgY29udGVudFdpbmRvdyB0byBkZXRlY3Qgd2hl
biB0aGUgdG9wIGRvY3VtZW50J3MgYm9keSBjaGFuZ2VzIHNpemUuCiAgICAgLy8gRklYTUU6IFNo
b3VsZCB3ZSBzZXRUaW1lb3V0IHRocm90dGxlIHRoZXNlPwpAQCAtODQ0LDYgKzEwMjAsMTUgQEAK
ICAgICBsb2FkRGlmZlN0YXRlKCk7CiAgIH0pOwogCisgIGZ1bmN0aW9uIGhhbmRsZVJldmlld0Zv
cm1Mb2FkKCkgeworICAgIHZhciBmb3JtID0gJCgnI3Jldmlld2Zvcm0nKS5jb250ZW50cygpLmZp
bmQoJ2Zvcm0nKVswXTsKKyAgICB2YXIgb2xkX3N1Ym1pdCA9IGZvcm0ub25zdWJtaXQ7CisgICAg
Zm9ybS5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkgeworICAgICAgZ19kcmFmdENvbW1lbnRTYXZlci5l
cmFzZSgpOworICAgICAgcmV0dXJuIG9sZF9zdWJtaXQoKTsKKyAgICB9OworICB9CisKICAgZnVu
Y3Rpb24gbG9hZERpZmZTdGF0ZSgpIHsKICAgICB2YXIgZGlmZnN0YXRlID0gbG9jYWxTdG9yYWdl
LmdldEl0ZW0oJ2NvZGUtcmV2aWV3LWRpZmZzdGF0ZScpOwogICAgIGlmIChkaWZmc3RhdGUgIT0g
J3NpZGVieXNpZGUnICYmIGRpZmZzdGF0ZSAhPSAndW5pZmllZCcpCkBAIC0xMDA1LDEzICsxMTkw
LDE0IEBACiAgICAgcmV0dXJuIGZyYWdtZW50OwogICB9CiAKLSAgZnVuY3Rpb24gZGlzY2FyZENv
bW1lbnQoKSB7Ci0gICAgdmFyIGxpbmVfaWQgPSAkKHRoaXMpLnBhcmVudHNVbnRpbCgnLmNvbW1l
bnQnKS5wYXJlbnQoKS5maW5kKCd0ZXh0YXJlYScpLmF0dHIoJ2RhdGEtY29tbWVudC1mb3InKTsK
KyAgZnVuY3Rpb24gZGlzY2FyZENvbW1lbnQoY29tbWVudF9ibG9jaykgeworICAgIHZhciBsaW5l
X2lkID0gY29tbWVudF9ibG9jay5maW5kKCd0ZXh0YXJlYScpLmF0dHIoJ2RhdGEtY29tbWVudC1m
b3InKTsKICAgICB2YXIgbGluZSA9ICQoJyMnICsgbGluZV9pZCkKICAgICBmaW5kQ29tbWVudEJs
b2NrRm9yKGxpbmUpLnNsaWRlVXAoJ2Zhc3QnLCBmdW5jdGlvbigpIHsKICAgICAgICQodGhpcyku
cmVtb3ZlKCk7CiAgICAgICBsaW5lLnJlbW92ZUF0dHIoJ2RhdGEtaGFzLWNvbW1lbnQnKTsKICAg
ICAgIHRyaW1Db21tZW50Q29udGV4dFRvQmVmb3JlKGxpbmUsIGxpbmUuYXR0cignZGF0YS1jb21t
ZW50LWJhc2UtbGluZScpKTsKKyAgICAgIHNhdmVEcmFmdENvbW1lbnRzKCk7CiAgICAgfSk7CiAg
IH0KIApAQCAtMTAyOCwyNCArMTIxNCwzNCBAQAogICAgICQoJy5MaW5rQ29udGFpbmVyJywgdGhp
cykuZWFjaChmdW5jdGlvbigpIHsgdGhpcy5zdHlsZS5vcGFjaXR5ID0gMDsgfSk7CiAgIH0KIAor
ICBmdW5jdGlvbiBoYW5kbGVEaXNjYXJkQ29tbWVudCgpIHsKKyAgICBkaXNjYXJkQ29tbWVudCgk
KHRoaXMpLnBhcmVudHMoJy5jb21tZW50JykpOworICB9CisgIAorICBmdW5jdGlvbiBoYW5kbGVB
Y2NlcHRDb21tZW50KCkgeworICAgIGZyZWV6ZUNvbW1lbnQoJCh0aGlzKS5wYXJlbnRzKCcuY29t
bWVudCcpKTsKKyAgICBzYXZlRHJhZnRDb21tZW50cygpOworICB9CisKICAgJCgnLkZpbGVEaWZm
JykubGl2ZSgnbW91c2VlbnRlcicsIHNob3dGaWxlRGlmZkxpbmtzKTsKICAgJCgnLkZpbGVEaWZm
JykubGl2ZSgnbW91c2VsZWF2ZScsIGhpZGVGaWxlRGlmZkxpbmtzKTsKICAgJCgnLnNpZGUtYnkt
c2lkZS1saW5rJykubGl2ZSgnY2xpY2snLCBoYW5kbGVTaWRlQnlTaWRlTGlua0NsaWNrKTsKICAg
JCgnLnVuaWZ5LWxpbmsnKS5saXZlKCdjbGljaycsIGhhbmRsZVVuaWZ5TGlua0NsaWNrKTsKICAg
JCgnLkV4cGFuZExpbmsnKS5saXZlKCdjbGljaycsIGhhbmRsZUV4cGFuZExpbmtDbGljayk7Ci0g
ICQoJy5jb21tZW50IC5kaXNjYXJkJykubGl2ZSgnY2xpY2snLCBkaXNjYXJkQ29tbWVudCk7CiAg
ICQoJy5mcm96ZW5Db21tZW50JykubGl2ZSgnY2xpY2snLCB1bmZyZWV6ZUNvbW1lbnQpOworICAk
KCcuY29tbWVudCAuZGlzY2FyZCcpLmxpdmUoJ2NsaWNrJywgaGFuZGxlRGlzY2FyZENvbW1lbnQp
OworICAkKCcuY29tbWVudCAub2snKS5saXZlKCdjbGljaycsIGhhbmRsZUFjY2VwdENvbW1lbnQp
OwogCi0gICQoJy5jb21tZW50IC5vaycpLmxpdmUoJ2NsaWNrJywgZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIGNvbW1lbnRfdGV4dGFyZWEgPSAkKHRoaXMpLnBhcmVudHNVbnRpbCgnLmNvbW1lbnQnKS5w
YXJlbnQoKS5maW5kKCd0ZXh0YXJlYScpOworICBmdW5jdGlvbiBmcmVlemVDb21tZW50KGNvbW1l
bnRfYmxvY2spIHsKKyAgICB2YXIgY29tbWVudF90ZXh0YXJlYSA9IGNvbW1lbnRfYmxvY2suZmlu
ZCgndGV4dGFyZWEnKTsKICAgICBpZiAoY29tbWVudF90ZXh0YXJlYS52YWwoKS50cmltKCkgPT0g
JycpIHsKLSAgICAgIGRpc2NhcmRDb21tZW50LmNhbGwodGhpcyk7CisgICAgICBkaXNjYXJkQ29t
bWVudChjb21tZW50X2Jsb2NrKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgdmFyIGxpbmVf
aWQgPSBjb21tZW50X3RleHRhcmVhLmF0dHIoJ2RhdGEtY29tbWVudC1mb3InKTsKICAgICB2YXIg
bGluZSA9ICQoJyMnICsgbGluZV9pZCkKICAgICBmaW5kQ29tbWVudEJsb2NrRm9yKGxpbmUpLmhp
ZGUoKS5hZnRlcigkKCc8ZGl2IGNsYXNzPSJmcm96ZW5Db21tZW50Ij48L2Rpdj4nKS50ZXh0KGNv
bW1lbnRfdGV4dGFyZWEudmFsKCkpKTsKLSAgfSk7CisgIH0KIAogICBmdW5jdGlvbiBmb2N1c09u
KG5vZGUpIHsKICAgICAkKCcuZm9jdXNlZCcpLnJlbW92ZUNsYXNzKCdmb2N1c2VkJyk7CkBAIC0x
MjA1LDYgKzE0MDEsOCBAQAogICAgIHNlbGVjdGVkLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICBh
ZGREYXRhQ29tbWVudEJhc2VMaW5lKHRoaXMsIGNvbW1lbnRfYmFzZV9saW5lKTsKICAgICB9KTsK
KworICAgIHNhdmVEcmFmdENvbW1lbnRzKCk7CiAgIH0pOwogCiAgIGZ1bmN0aW9uIGFkZERhdGFD
b21tZW50QmFzZUxpbmUobGluZSwgaWQpIHsK
</data>
<flag name="review"
          id="71258"
          type_id="1"
          status="+"
          setter="abarth"
    />
    <flag name="commit-queue"
          id="71629"
          type_id="3"
          status="-"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>